2010-05-05 88 views

回答

21
SELECT * FROM users 
LEFT JOIN private AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type = 1 

UNION 

SELECT * FROM users 
LEFT JOIN company AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type != 1 

我認爲這是你正在嘗試做的,不是嗎?如您現在所說的列數不同,您需要指定列(例如,列)。

SELECT 'private' AS detailType, users.*, col1, col2, col3, '' FROM users 
LEFT JOIN private AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type = 1 

UNION 

SELECT 'company', users.*, col1, '', '', col4 FROM users 
LEFT JOIN company AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type != 1 

在這個例子中,私人擁有列COL1,COL2和COL3,同時公司擁有col1和COL4,但你希望他們所有。

+0

我不知道爲什麼現在我得到 #1222 - 如果我只使用代碼的一部分,即使用的SELECT語句具有不同數量的列 – plugowski 2010-05-05 08:17:35

+0

。 SELECT * FROM用戶 LEFT JOIN私有AS users.id = details.user_id WHERE users.id = 1 AND users.type = 1 細節,但如果我使用UNION我已經得到錯誤#1222 – plugowski 2010-05-05 08:24:28

+0

如果您在兩個表(私人和公司)中有不同數量的列,那麼您需要在SELECT中指定相同數量的列。您可以使用NULL,''或任何您想要的填充空白。 – Cez 2010-05-05 08:41:34

6
SELECT 
    users.*, 
    details.info, 
    CASE users.type WHEN '1' THEN 'private' ELSE 'company' END AS user_type 
FROM 
    users 
    INNER JOIN (
    SELECT user_id, info FROM private 
    UNION 
    SELECT user_id, info FROM company 
) AS details ON details.user_id = users.id 

編輯:回答(問題誤解)的原始版本:

SELECT 
    *, 
    CASE type WHEN '1' THEN 'private' ELSE 'company' END AS details 
FROM 
    users 
WHERE 
    users.id = 1 
+0

這不正是我想要的。 私人和公司是兩個不同的表,我想加入: 當user.type == 1我想JOIN私人ON user.id = private.user_id 和當user.type == 2我想要JOIN公司ON user.id = company.user_id – plugowski 2010-05-05 08:04:06

+0

@plugowski:查看已更改的答案。 – Tomalak 2010-05-05 08:57:36

15

我相信這已經解決了,但對於有類似問題的人。

您也可以嘗試將多個左聯接,以獲取所有數據

SELECT *, IF (users.type = 1, p.name, c.name) AS name FROM users 
LEFT JOIN private AS p ON (users.type = 1 AND users.id = p.user_id) 
LEFT JOIN company AS c ON (users.type != 1 AND users.id = c.user_id)