Выбор с использованием двух имен столбцов, с использованием другого, если одно известно из каждой записи - PullRequest
2 голосов
/ 17 декабря 2011

Я не совсем уверен, как сформулировать это как краткое название вопроса.

У меня есть таблица games, которая содержит записи, представляющие игры одного игрока против другого. Соответствующие столбцы этой таблицы userid1 и userid2. У меня есть еще одна таблица с именем accounts, состоящая из столбцов id и username.

Я хотел бы получить имя пользователя оппонента из таблицы accounts. Оппонентом является пользователь, идентификатор которого не равен известному идентификатору пользователя. Итак, если 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 равно известному идентификатору пользователя
  • games.userid1, если games.userid2 равно известному идентификатору пользователя

и если да, то как?

1 Ответ

2 голосов
/ 17 декабря 2011

Вы можете использовать оператор 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...