2013-04-16 168 views
0

給定一個主鍵爲id的用戶表,我有一個名爲friends的外部表,它只有兩個字段(userid1, userid2)。這使我們能夠在不同的用戶之間創建任何類型的關係(一對多,一對一等)。用戶可以出現在任一列中,並且兩列都相同。 IOW,每個關係單個條目。SQL查找基於兩列的記錄

我怎樣才能拉給定用戶id有的所有朋友。說強尼,有3個朋友和他的用戶id16 ...我的SQL查詢應該是這樣嗎?

SELECT * 
FROM db.users 
     JOIN db.friends 
     ON db.users.id = db.friends.userid1 
      AND db.users.id = 16 

希望這是明確的。另外,如果可能,我可以從結果集中排除Jonny嗎?

該查詢,由於上市吉斯我下面的:

id  name uuid      birthday  userid1 userid2 
16 jonny ABCDEFGHIJKLMNOP 1967-04-27 01:00:00  1   2 
16 jonny ABCDEFGHIJKLMNOP 1967-04-27 01:00:00  1   3 

這是相當接近,但我想他的朋友,而不是強尼


謝謝你們,讓我得到它的工作謝謝你。這是最後的工作查詢。

SELECT * 
FROM db.users 
WHERE db.users.id IN 
(
    SELECT db.friends.userid2 as id FROM db.friends WHERE db.friends.userid1 = 16 
    union 
    SELECT db.friends.userid1 as id FROM db.friends WHERE db.friends.userid2 = 16 
) 

這給了我:

id  name uuid      birthday 
2 robin ABCDEFGHIJKLMNOP 1967-04-27 01:00:00 
3 gary ABCDEFGHIJKLMNOP 1967-04-27 01:00:00 
+0

執行查詢你提出並告訴我們結果是否符合您的需求(如果不是,以哪種方式失敗)。 – Oswald

+0

jonnies的朋友是擁有'id' 2和3的用戶。所以你已經有jonnies的朋友了。哪裏有問題? – Oswald

+0

是的。朋友是我們想要的。我真的不需要兩個額外的列,但沒關係。 –

回答

1

你可以做一個子查詢,如:

SELECT * 
FROM users 
WHERE id IN 
(
    SELECT userid2 as id FROM db.friends WHERE userid1 = 16 
) 
+0

這是非常接近的,如果我可以讓它工作在兩個方向,以便用戶ID可以在任一列,並仍然給我們的名單,那麼我會擁有它。 –

+0

因此,只需在子查詢中執行OR操作。 「WHERE userid1 = 16或userid2 = 16」 – CMR

1

添加爲user.id的條件,你where條款底:

Select * From users 
INNER JOIN friends on 
users.id = friends.userid1 
Where users.id = 16 

而且,我會用一個Inner Join這將返回所有僅在users的記錄中有匹配的地方friends

+0

在MySQL中,一個普通的'JOIN'關鍵字意味着'INNER JOIN'。 –

+0

條件'users.id = 16'可能是OP中提議的查詢中的ON子句的一部分。 – Oswald

+0

@MichaelBerkowski我只是詳細說明了我的答案,並不是說兩者不同 –

1

你應該在朋友表進行篩選,而不是用戶表。

SELECT friends.* 
FROM friends 
INNER JOIN users 
    ON friends.userid2 = users.id 
WHERE friends.userid1 = 16 

如果您只是需要朋友的ID那就沒有理由加入所有

SELECT userid2 
FROM friends 
WHERE userid1 = 16 
+0

要查找的目標ID可以在任一列中。 IOW,jonny可以在第1列或第2列。 –

+0

那麼你不會在該表中添加雙向關係?即當用戶1的朋友用戶100有兩個記錄輸入'1 | 100'和'100 | 1'?這會讓你的生活在查詢時變得更加困難,因爲你還沒有真正定義用戶列和朋友列。您可能會強制自己做子選擇或將兩個查詢的結果聯合起來。 –

+0

不,如果我做得對,只會有一個條目。我應該做兩個? –

1

你需要的朋友ID列表:

SELECT U FROM DB.USERS U WHERE U.ID IN (SELECT F.USERID2 FROM DB.FRIENDS F WHERE F.USERID1 = 16)

+0

OP不希望根據他的問題「我怎樣才能拉出給定用戶ID所有的朋友。」 – Oswald

+0

我認爲這兩種關係都是雙向的,或者是要求外向關係 –

+0

啊,現在我已經刷新了頁面,看到了結果,我明白了他的要求! –