我不完全确定如何将此作为简明的问题标题。
我有一个games
表,其中包含代表玩家与另一玩家的游戏的记录。此表格的相关列为userid1
和userid2
。我有另一个名为accounts
的表格,其中包含id
和username
列。
我想从accounts
表格中获取对手的用户名。对手是id不等于已知用户id的用户。因此,如果userid1 = 123
,那么我想要获取accounts.username
等于同一accounts.id
条记录的userid2
的用户games
。如果是userid2 = 123
,那么反过来也是如此。
到目前为止,我只能使用两个查询分别选择对手的用户名:
SELECT * FROM games, accounts
WHERE games.userid1 = 123 AND accounts.id = games.userid2
和
SELECT * FROM games, accounts
WHERE games.userid2 = 123 AND accounts.id = games.userid1
(swapped: ^ ^)
但是,我想将这两个查询很好地合并为一个。那么,是否有可能accounts.username
accounts.id
等于:
games.userid2
如果games.userid1
等于已知用户ID games.userid1
如果games.userid2
等于已知用户ID 若然,怎么样?
答案 0 :(得分:2)
您可以在连接条件中使用case语句,如下所示:
SELECT * FROM games g
JOIN accounts a
ON a.id = case g.userid1 when ? then g.userid2 else g.userid1 end
WHERE
g.userid1 = ? OR g.userid2 = ?
但是,根据您的索引,使用联合可能会更快,例如
SELECT * FROM games g
JOIN accounts a ON a.id = case g.userid2
WHERE g.userid1 = ?
UNION ALL
SELECT * FROM games g
JOIN accounts a ON a.id = case g.userid1
WHERE g.userid2 = ?
使用OR
,
SELECT * FROM games g, accounts a
WHERE
(g.userid1 = ? AND g.userid2 = a.id)
OR (g.userid2 = ? AND g.userid1 = a.id)