2010-05-05 91 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)