因此,我有一个数据库,它将用户数据存储在自己的表中,供任何可能需要它的人使用。然后,一个项目表,其中有一列用于标识分配给项目的用户,但它可以为null(以防有人还没有分配它)。当我需要显示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
有人知道我该怎么做吗?
您需要使用Left Join
而不是隐含的INNER JOIN
,因为您需要projects
表中的所有记录以及users
表中的任何记录。此外,当u.id
是null
时,您需要一个CASE
语句(或者if
语句,如果这更符合您的风格)来制作user
null
。
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;
正如您所提到的,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