2011-10-03 136 views
4

嗨,大家好我试着做一些像MySQL的if语句有条件加入

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 

对不起它有点sqlenglish,但我真的不知道该怎么写出来!

+0

告诉我你的表模式与关系在这些表格之间..你有很多语法错误 – diEcho

+0

如果你不知道你想要它做什么,你如何编写一个查询?请尝试用文字描述你想要什么。它也会帮助你自己。当你开始描述问题时,你通常会看到解决方案。 – GolezTrol

+2

读取已写入的伪查询,它显示@Akshat想要根据'account_type'的值在'peopletable'和'companytable'上加入'accounttable'。相当直截了当地给我。 – Romain

回答

15

什么是这样的:

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类似语法here ...

+0

完美的作品(第三行peopletable.id应该是companytable.companyid)非常聪明的方式来使用acountype = xx和'和'在一起! – Akshat

+0

@Akshat固定了答案,包括你的笔记上的错字:) – Romain

6
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是充分表名的别名,这样可以节省打字。

此查询将连续提供p。*或c。*的所有null
你可以重写,像这样的选择部分:

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

+1,太快了,打我 – diEcho

+0

@diEcho:罗曼已经给出了快速的答案,不是吗? –

0

它必须像下面(据我了解)

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' 
+0

查询中的systax错误。 ON在第二次加入时是2次。 –

+0

哎呀!它的错字。为什么downvoted !!,至少首先提到 – diEcho

+0

约翰和我做了同样的事,你给了我投票。 –