MySQL if оператор условного соединения - PullRequest
4 голосов
/ 03 октября 2011

Привет, ребята, я пытаюсь сделать что-то вроде

SELECT * from accounttable, peopletable, companytable 
WHERE if accounttable.account_type = company 
JOIN companytable 
WHERE companytable.id = accounttable.company_id 
ELSE IF accounttable.account_type = = person 
JOIN peopletable 
  WHERE peopletable.id = accounttable.person_id

Мне очень жаль, но я немного не знаю, как это написать!

Ответы [ 3 ]

15 голосов
/ 03 октября 2011

Как насчет чего-то вроде:

SELECT * 
from accounttable
left join peopletable ON (accounttype = 'person' AND peopletable.id = accounttable.person_id)
left join companytable ON (accounttype = 'company' AND companytable.id = accounttable.company_id)

Я объединю обе таблицы, поэтому у вас будут поля всех трех таблиц в выходных данных.Поля peopletable будут NULL, если accounttype != 'person', а поля companytable будут NULL, где accounttype != 'company'.

. Подробнее о синтаксисе LEFT JOIN можно узнать в некоторых местах.как здесь ...

6 голосов
/ 03 октября 2011
SELECT a.*, p.*, c.* from accounttable a
LEFT JOIN peopletable p ON (a.person_id = p.id AND a.account_type = 'person')
LEFT JOIN companytable c ON (a.company_id = c.id AND a.account_type = 'company')

Обратите внимание, что a, p, c являются псевдонимами для полных имен таблиц, это экономит при наборе.

Этот запрос выдаст все null для p. * Или c. * Встрока.
Вы можете переписать выбранную часть следующим образом:

SELECT 
  a.id, a.accounttype
  , COALESCE(p.name, c.name) as name
  , COALESCE(p.address, c.address) as address
....
FROM .....

См .: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce

0 голосов
/ 03 октября 2011

ЭТО ДОЛЖНО БЫТЬ как ниже (насколько я понимаю)

SELECT a.*,p.*,c.* 
FROM accounttable a
LEFT JOIN companytable c ON c.id = a.company_id AND a.account_type = 'company'
LEFT JOIN peopletable p ON p.id = a.person_id AND  a.account_type = 'person'
...