Mysql 如果不为NULL,则显示第二个表中的CONCAT()

Mysql 如果不为NULL,则显示第二个表中的CONCAT(),mysql,null,left-join,concat,Mysql,Null,Left Join,Concat,所以,我有一个数据库,它将用户数据存储在自己的表中,供任何可能需要它的人使用。然后,将创建一个projects表,其中包含一列,用于标识分配给该项目的用户,但可以为空(以防尚未分配给其他人)。如果分配的用户ID不为空,则需要显示用户表中的“last,first” 如果所有项目都有一个用户分配,下面是我的建议: SELECT p.name, CONCAT(u.lastName, ', ', u.firstName) AS user, p.dueDate FROM projects p, user

所以,我有一个数据库,它将用户数据存储在自己的表中,供任何可能需要它的人使用。然后,将创建一个projects表,其中包含一列,用于标识分配给该项目的用户,但可以为空(以防尚未分配给其他人)。如果分配的用户ID不为空,则需要显示用户表中的“last,first”

如果所有项目都有一个用户分配,下面是我的建议:

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
时,这将导致没有结果,我需要它仍然显示项目,只是将字段留空。这里有一把小提琴:

我尝试过使用
CONCAT_WS()
()和
左连接
(),结果相同:

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

有人知道我如何做到这一点吗?

您需要使用
左连接
而不是隐含的
内部连接
,因为您需要
项目
表中的所有记录以及
用户
表中的所有记录。此外,当
u.id
null
时,您还需要一个
CASE
语句(或者
if
语句,如果这更符合您的风格),以使
用户
为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; 

您需要使用
左联接
而不是隐含的
内部联接
,因为您需要
项目
表中的所有记录以及
用户
表中的所有记录。此外,当
u.id
null
时,您还需要一个
CASE
语句(或者
if
语句,如果这更符合您的风格),以使
用户
为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; 

正如您所提到的,
左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; 

正如您所提到的,
左连接是一种方法,但您在其中使用了错误的表。
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; 

对于您提供的额外信息,我想将您的标记为正确。对不起,谢谢你的帮助^^对于你提供的额外信息,我想把你的标记改为正确。对不起,谢谢你的帮助^^完美的谢谢你的帮助。:)完美的谢谢你的帮助。:)