Mysql 如何在SQL中有条件地从联接表中选择字段?
上面的查询是有效的,但我想知道是否有可能在没有子查询的情况下得到相同的结果 我有一个任务表,其中包含创建任务的用户的user_id列,还有一个用户表,其中包含用户数据,如昵称 然后有一个task_user表映射分配给任务的用户 我的困惑在于如何获得不同的昵称:一个对应于task.user\u id(创建者),另一个对应于task\u user.user\u id(受让人) 下面的查询不起作用,在responsibleUsers字段上重复creatorUserId和CreatorUser昵称,导致单个任务有多行Mysql 如何在SQL中有条件地从联接表中选择字段?,mysql,sql,Mysql,Sql,上面的查询是有效的,但我想知道是否有可能在没有子查询的情况下得到相同的结果 我有一个任务表,其中包含创建任务的用户的user_id列,还有一个用户表,其中包含用户数据,如昵称 然后有一个task_user表映射分配给任务的用户 我的困惑在于如何获得不同的昵称:一个对应于task.user\u id(创建者),另一个对应于task\u user.user\u id(受让人) 下面的查询不起作用,在responsibleUsers字段上重复creatorUserId和CreatorUser昵称,导致
SELECT
title,
description,
status,
task.user_id AS creatorUserId,
(SELECT user.nickname FROM user WHERE user.id = task.user_id) AS creatorUserNickname,
GROUP_CONCAT(user.id, "," ,user.nickname SEPARATOR ";") as responsibleUsers
FROM task JOIN task_user ON task.id = task_user.task_id
JOIN user ON task_user.user_id = user.id
GROUP BY title, description, status, creatorUserId, creatorUserNickname;
是否有方法根据引用其id的表选择不同的user.nickname
非常感谢 您需要2个用户加入。
第一个用于返回创建者的详细信息,第二个用于返回分配给任务的用户:
SELECT
title,
description,
status,
task.user_id AS creatorUserId,
user.nickname AS creatorUserNickname,-- this user is referenced in task.user_id
GROUP_CONCAT(user.id,"," ,user.nickname SEPARATOR ";") as responsibleUsers -- these in task_user.user_id
FROM task JOIN task_user ON task.id = task_user.task_id
JOIN user ON task_user.user_id = user.id OR task.user_id = user.id
GROUP BY title, description, status, creatorUserId, creatorUserNickname;
实际上,我建议您将查询编写为:
SELECT
t.title,
t.description,
t.status,
u1.user_id AS creatorUserId,
u1.nickname AS creatorUserNickname,
GROUP_CONCAT(u2.id, ',' , u2.nickname SEPARATOR ';') AS responsibleUsers
FROM task t
INNER JOIN task_user tu ON t.id = tu.task_id
INNER JOIN user u1 ON t.user_id = u1.id
INNER JOIN user u2 ON tu.user_id = u2.id
GROUP BY t.title, t.description, t.status, creatorUserId, creatorUserNickname;
这避免了外部聚合,这将提高性能。它还包括所有任务,甚至包括那些没有负责用户的任务。我猜这是件好事。您必须加入用户表两次。
SELECT t.title, t.description, t.status,
t.user_id as creatorUserId, u.nickname as creatorUserNickname,
(SELECT GROUP_CONCAT(u.id, ',', u.nickname SEPARATOR ';)
FROM task_users tu JOIN
users u
ON tu.user_id = u.user_id
WHERE tu.task_id = t.id
) as responsibleUsers
FROM task t JOIN
user u
ON t.user_id = u.id ;