2012-04-15 64 views
2

表結構(?):MySQL的棘手雙/三JOIN

users: uid, name 
    friendships: uid1, uid2 
    game_membership: gid, uid 

基本上我試圖讓一個查詢作爲gid函數,返回:

uid1, name1, uid2, name2 

,其中僅uid表示在game_membership表中給出的gid被返回。這是我到目前爲止:

SELECT 
    f.uid1 AS id1, 
    u1.name AS name1, 
    f.uid2 AS id2, 
    u2.name AS name2 
FROM 
    friendships AS f 
WHERE 
    u1.uid in (SELECT uid FROM game_membership WHERE gid = <GID>) 
    AND u2.uid in (SELECT uid FROM game_membership WHERE gid = <GID>) 
JOIN users AS u1 ON f.uid1 = u1.uid 
JOIN users AS u2 ON f.uid2 = u2.uid 

我剛剛得到一個MySQL語法錯誤。任何人都可以將我指向正確的方向嗎?我覺得我可能需要在game_membership表中的uiduid表中每個uid一個做另一個JOIN或兩個JOIN。

+1

我相信你應該在你的Where子句之前加入 – Fido 2012-04-15 21:34:14

+0

不要使用'where..in(select)'構造 - 總是學會把它寫成連接!您將實現[更好的性能](http://stackoverflow.com/a/9982157/684229)。看到我的答案。 – TMS 2012-04-15 21:47:02

回答

9

我會建議你加入到Game_membership表而不是WHERE子句:

SELECT 
    f.uid1 AS id1, 
    u1.name AS name1, 
    f.uid2 AS id2, 
    u2.name AS name2 
FROM 
    friendships AS f 
JOIN game_membership AS user1_gm ON user1_gm.uid = f.uid1 
JOIN game_membership AS user2_gm ON user2_gm.uid = f.uid2 
JOIN users AS u1 ON f.uid1 = u1.uid 
JOIN users AS u2 ON f.uid2 = u2.uid 
WHERE user1_gm.gid = <GID> AND user2_gm.gid = <GID> 
1

添加加入到你的FROM條款是這樣的:

FROM friends f 
    LEFT OUTER JOIN users u1 ON f.uid1 = u1.uid 
    LEFT OUTER JOIN users u2 on f.uid2 = u2.uid 
1

備選:

SELECT 
    f.uid1 AS id1, 
    u1.name AS name1, 
    f.uid2 AS id2, 
    u2.name AS name2 
FROM friendships AS f 
INNER JOIN users AS u1 
    ON f.uid1 = u1.uid 
INNER JOIN users AS u2 
    ON f.uid2 = u2.uid 
INNER JOIN game_membership GMS 
    ON GMS.UID=U1.UID 
INNER JOIN game_membership GMS2 
    ON GMS2.UID=U2.UID 
WHERE 
    GMS.GID= <GID> and GMS2.GID=<GID> 

現在它不是一個替代與保羅的:D

+0

需要兩個連接到'game_membership'。你的'ON GMS.UID = U1.UID AND GMS.UID = U2.UID'似乎是錯誤的。 – 2012-04-15 22:12:13

+0

這是因爲它是:D mmm不能downvote我自己的答案:D – xQbert 2012-04-15 22:33:04

1
select uid1, u1.name as name1, uid2, u2.name as name2 
from friendships 
    join game_membership as g1 on uid1 = g1.uid 
    join game_membership as g2 on uid2 = g2.uid 
    join users as u1 on uid1 = u1.uid 
    join users as u2 on uid2 = u2.uid 
where g1.gid = <GID> and g2.gid = <GID>