MySQL, если заявления, как - PullRequest
       11

MySQL, если заявления, как

0 голосов
/ 01 февраля 2012

Как мне кодировать это в mysql?

, если tbl_comments.to - это число, затем присоединиться к tbl_users

, если tbl_comments.to - ключ игрока, затем присоединиться к персоне таблицы и отображать имена

, если tbl_comments.to является ключом команды, затем присоединиться к командам таблицы и отобразить имена

, если tbl_comments.to является ключом лиги, затем присоединиться с помощью tbl_sports

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Практика использования столбца, который ссылается на одну из нескольких возможных таблиц, называется полиморфными ассоциациями . Это хак, который нарушает правила проектирования реляционных баз данных.

SQL не поддерживает условные объединения в разные таблицы в зависимости от значения, которое вы найдете в данной строке. Все таблицы должны быть известны в тот момент, когда база данных анализирует запрос.

Вы можете присоединиться к всем таблицам с внешними объединениями, потому что ровно одна из этих таблиц должна содержать совпадение:

SELECT c.*, COALESCE(u.name, p.name, t.name, s.name) AS name
FROM tbl_comments AS c
LEFT OUTER JOIN tbl_users u ON c.to = u.id AND c.type = 'number'
LEFT OUTER JOIN tbl_persons p ON c.to = p.id AND c.type = 'player'
LEFT OUTER JOIN tbl_teams t ON c.to = t.id AND c.type = 'team'
LEFT OUTER JOIN tbl_sports s ON c.to = s.id AND c.type = 'league';

Или вы можете присоединиться к одной из этих таблиц, но ограничиться строками, которые, как вы знаете, совпадают:

SELECT c.*, u.name
FROM tbl_comments AS c
INNER JOIN tbl_users u ON c.to = u.id 
WHERE c.type = 'number'
  UNION ALL 
SELECT c.*, p.name
FROM tbl_comments AS c
INNER JOIN tbl_persons u ON c.to = p.id 
WHERE c.type = 'player'
  UNION ALL 
SELECT c.*, t.name
FROM tbl_comments AS c
INNER JOIN tbl_teams t ON c.to = t.id 
WHERE c.type = 'team'
  UNION ALL 
SELECT c.*, s.name
FROM tbl_comments AS c
INNER JOIN tbl_sports s ON c.to = s.id 
WHERE c.type = 'league'
0 голосов
/ 01 февраля 2012

Как вы можете определить, что такое tbl_comments.to, у вас есть другой столбец для сохранения типа?

Или вам нужно объединить все столы.

SELECT * FROM tbl_comments c
LEFT JION ON tbl_users u ON c.to = u.id
LEFT JION ON tbl_persons p ON c.to = p.id
LEFT JION ON tbl_teams t ON c.to = t.id
LEFT JION ON tbl_sports s ON c.to = s.id
...