Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在SQL中有条件地从联接表中选择字段?_Mysql_Sql - Fatal编程技术网

Mysql 如何在SQL中有条件地从联接表中选择字段?

Mysql 如何在SQL中有条件地从联接表中选择字段?,mysql,sql,Mysql,Sql,上面的查询是有效的,但我想知道是否有可能在没有子查询的情况下得到相同的结果 我有一个任务表,其中包含创建任务的用户的user_id列,还有一个用户表,其中包含用户数据,如昵称 然后有一个task_user表映射分配给任务的用户 我的困惑在于如何获得不同的昵称:一个对应于task.user\u id(创建者),另一个对应于task\u user.user\u id(受让人) 下面的查询不起作用,在responsibleUsers字段上重复creatorUserId和CreatorUser昵称,导致

上面的查询是有效的,但我想知道是否有可能在没有子查询的情况下得到相同的结果

我有一个任务表,其中包含创建任务的用户的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 ;