如果不是NULL,则从第二个表显示CONCAT()

时间:2014-10-22 17:53:37

标签: mysql null left-join concat

所以,我有一个数据库,它将用户数据存储在自己的表中,供任何可能需要它的东西使用。然后,一个带有列的项目表,用于标识分配给项目的用户,但它可以为空(如果还没有人分配它)。当我需要在users表中显示“last,first”时,如果分配的用户ID不是NULL。

如果所有项目都有用户分配,那么这就是我所拥有的:

SELECT p.name, CONCAT(u.lastName, ', ', u.firstName) AS user, p.dueDate 
FROM projects p, users u 
WHERE p.uid = u.id 
ORDER BY p.id DESC; 

p.uidNULL时,这会导致无结果,我需要它仍然显示项目,只是将该字段留空。这是一个SQLFiddle:http://sqlfiddle.com/#!2/cff66/1

我已尝试使用CONCAT_WS()http://sqlfiddle.com/#!2/cff66/2)和LEFT JOINhttp://sqlfiddle.com/#!2/cff66/3),结果相同:

Name   | User      | Due Date
---------------------------------------------------
Proj 4 | Doe, John | October, 24 2014 00:00:00+0000
Proj 2 | Doe, John | October, 27 2014 00:00:00+0000

我需要它显示的是:

Name   | User      | Due Date
----------------------------------------------------
Proj 5 |           | December, 25 2014 00:00:00+0000
Proj 4 | Doe, John | October, 24 2014 00:00:00+0000
Proj 3 |           | October, 30 2014 00:00:00+0000
Proj 2 | Doe, John | October, 27 2014 00:00:00+0000
Proj 1 |           | October, 22 2014 00:00:00+0000

任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

您需要使用Left Join而不是隐含的INNER JOIN,因为您需要projects表中的所有记录以及users中可以找到的所有记录表。此外,当CASE为{{if时,您需要user语句(或null语句,如果这更符合您的风格)u.id null 1}}。

SELECT p.name, 
    CASE WHEN u.id IS NOT NULL THEN CONCAT(u.lastName, ', ', u.firstName) ELSE NULL END AS user, 
    p.dueDate 
FROM 
    projects p 
    LEFT OUTER JOIN users u on p.uid = u.id 
ORDER BY p.id DESC; 

答案 1 :(得分:2)

正如您所提到的,left join是可行的方法,但您使用了错误的表格。 left join应该应用于您的案例中可能“缺少”行users的表格。为了处理没有人分配给项目的情况,您可以使用case表达式:

SELECT          p.name, 
                CASE WHEN u.id IS NOT NULL 
                     THEN CONCAT(u.lastName, ', ', u.firstName) 
                END AS user, 
                p.dueDate 
FROM            projects p
LEFT OUTER JOIN users u ON p.uid = u.id 
ORDER BY        p.id DESC; 

<强> SQLFiddle