选择使用两个列名称,如果知道每个记录,则使用另一个列名称

时间:2011-12-17 16:36:51

标签: mysql sql

我不完全确定如何将此作为简明的问题标题。

我有一个games表,其中包含代表玩家与另一玩家的游戏的记录。此表格的相关列为userid1userid2。我有另一个名为accounts的表格,其中包含idusername列。

我想从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

若然,怎么样?

1 个答案:

答案 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)