所以,我有一个数据库,它将用户数据存储在自己的表中,供任何可能需要它的东西使用。然后,一个带有列的项目表,用于标识分配给项目的用户,但它可以为空(如果还没有人分配它)。当我需要在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.uid
为NULL
时,这会导致无结果,我需要它仍然显示项目,只是将该字段留空。这是一个SQLFiddle:http://sqlfiddle.com/#!2/cff66/1
我已尝试使用CONCAT_WS()
(http://sqlfiddle.com/#!2/cff66/2)和LEFT JOIN
(http://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
任何人都知道如何做到这一点?
答案 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 强>