2012-05-07 25 views
2

我有三個MySQL的InnoDB表: 債務人 公司 個人MySQL的中頻SELECT

現在我想找到有關債務人的信息。 以下SQL不起作用,任何人都可以幫我編寫工作SQL嗎?

SELECT 
    d.id, 
    d.type, 
    i.name 
FROM 
    debtors AS d 
IF d.type = 'c' THEN 
    INNER JOIN 
     companies AS i ON (i.debtor_id = d.id) 
ELSE THEN 
    INNER JOIN 
     private_individuals AS i ON (i.debtor_id = d.id) 
WHERE 
    d.id = 1 

錯誤:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF d.type = 'c' THEN INNER JOIN companies AS i ON (i.debtor_id = d.i' at line 7 

提前感謝!

+0

您是否嘗試過狩獵MySQL文檔中'IF'?例如。爲'IF'找到正確的語法?你正在嘗試做那些在MySQL中不可行的東西(可能完全在SQL上)。 – Romain

回答

3

這就是你通常會達到這個目的:

SELECT d.id, d.type, COALESCE(c.name, p.name) 
FROM debtors d 
LEFT JOIN companies c 
    ON d.type = 'c' AND c.debtor_id = d.id 
LEFT JOIN private_individuals p 
    ON d.type = 'p' AND p.debtor_id = d.id 
WHERE d.id = 1 
+0

謝謝,這是我用過的解決方案! –

4

你不能使用這樣的IF

這裏是一個可能的解決方案:

SELECT 
    d.id, 
    d.type, 
    COALESCE(i.name, i2.name) as name 
FROM 
    debtors AS d 
    LEFT JOIN companies AS i ON i.debtor_id = d.id and d.type = 'c' 
    LEFT JOIN private_individuals AS i2 ON i2.debtor_id = d.id and d.type <> 'c' 
WHERE 
    d.id = 1 

另一種可能是動態SQL,但你應該避免! :)

+0

兩個通常的解決方案是'LEFT JOIN',就像你的例子和'UNION'一樣,這在性能方面是不好的。第三個選項是子查詢。不夠漂亮,絕對不如'LEFT JOIN'快,但在'IF'內工作。 +1爲適當的解決方案。 –

+0

謝謝,這個解決方案的工作原理。 –