2017-03-20 6 views
0

のJOIN:次のようにOR条件INNERで私は(ポイント)を以下のように構造化テーブルを持っている

id1 | id2 | p1 | p2 
1  3  5 7 
3  1  2 4 
1  2  1 7 

、別のテーブルには、strucuted(ユーザー):

id | name 
1 User1 
2 User2 
3 User3 

だから今、私は、クエリを必要としますIDを指定すると(例えば3)、id1とid2の列にIDが表示されているかどうかを確認し、2つの列のいずれかに表示されている場合は、選択した行からID1とID2のユーザー名を返します。だから、例えば私は、特定のID 3、クエリは私に戻って与える場合:

name1 | name2 | p1 | p2 
User1 User3 5 7 
User3 User1 2 4 

私は、さまざまなソリューションが、それを行うには方法を試してみました、私はINNERでOR条件が必要だと思い登録しようが、私ドンそれが可能かどうか、それが解決策かどうかは分かりません。ここで何も見つかりませんでした。

INNER JOIN users ON (users.id = points.id1) || (users.id = points.id2) 

そのための任意のソリューション:

私のような何かを意味ですか?おかげ

+1

あなたはより良い別の二つが結合を使用し.. –

+0

2つのSQLリクエスト(内部結合ごとに1つ)とユーザーUNION https://www.w3schools.com/sql/sql_union.asp – Amitsouko

+0

あなたのテーブルデザインは私には見えます。私はIDが単一の列になければならないと思うので、繰り返し値を集約してチェックするのが簡単になります。 –

答えて

1

二回ユーザーテーブルに参加するために制限する必要が一致するすべての値が得られます:

SELECT u1.name, u2.name, p.p1, p.p2 
    FROM points p 
    JOIN users u1 ON u1.id = p.id1 
    JOIN users u2 ON u2.id = p.id2 
WHERE u1.id = 3 OR u2.id = 3 
+0

@TimBiegeleisen彼はそれをパラメータのプレースホルダーで置き換える必要があります。 –

0

ユースケースステートメントは、それはあなたではない一つまたは二つの値

CREATE TABLE points (id1 int(2), id2 int(2), p1 int(2), p2 int(2)); 
INSERT INTO points VALUES(1,3,5,7); 
INSERT INTO points VALUES(3,1,2,4); 
INSERT INTO points VALUES(1,2,1,7); 

CREATE TABLE users (id int(2), name char(23)); 
INSERT INTO users VALUES(1,'user1'); 
INSERT INTO users VALUES(2,'user2'); 
INSERT INTO users VALUES(3,'user3');  

    SELECT (CASE WHEN u.id = p.id1 THEN u.name END) AS name1, 
    (CASE WHEN u1.id = p.id2 THEN u1.name END) AS name2, 
    p1, p2 
    FROM points p 
    INNER JOIN users u ON (u.id = p.id1) 
    INNER JOIN users u1 ON (u1.id = p.id2); 
関連する問題