【问题标题】:Mysql LEFT JOIN not returing expected resultMysql LEFT JOIN 未返回预期结果
【发布时间】:2014-04-25 16:39:07
【问题描述】:

我正在尝试使用以下 4 个表创建 LEFT JOIN。 想法是显示用户 ID 的 parent.name。应该 groupconcat 子名,如果用户不在子用户表中,则 child.name 应该为 NULL

以下是用户 id 1 的预期结果:

  id     parentname    childname
-------------------------------------------------
  1        parent1      child1,child3

以下是用户 ID 2 的预期结果: 这个用户不在 childusers 表中,所以它应该返回 null

  id     parentname    childname
-------------------------------------------------
  1        parent2      NULL

表格:

父母

 id        parentname
--------------------------------------------
  1        parent1
  2        parent2
  3        parent3

孩子

  id        childname     parent_id
-----------------------------------------------
  1         child1       1
  2         child2       2
  3         child3       1

父母用户

  id        parent_id    user_id
-------------------------------------------------------
  1            1           1
  2            2           2
  3            3           1

子用户

  id        child_id    user_id
-------------------------------------------------------
  1            1           1

这是我的查询:

 SELECT parent.name AS parentname,
 GROUP_CONCAT(child.name SEPARATOR ',') AS childname
 FROM parentusers,parent
 LEFT JOIN child
 ON parent.id=child.parent_id
 WHERE parentusers.parent_id= parent.id
 AND parentusers.user_id='1'
 GROUP BY parent.id

我已经编写了两个单独的查询,但想将这两个查询组合成上述结果格式的单个结果。

 select parent.parentname from parent,parentusers
 where parent.id=parentusers.parent_id
 and parentusers.user_id=1 ;

 select GROUP_CONCAT(child.childname) as childname from child
 LEFT JOIN childusers
 ON child.id=childusers.child_id
 where childusers.user_id=1;

谢谢..

【问题讨论】:

标签: mysql


【解决方案1】:

我在您的查询中看到以下错误:

  1. FROM 子句前面有一个语法错误(额外的逗号)。

  2. 您将表 child 的别名命名为 sub,然后您尝试加入 child.parent_id

试试这个:

SELECT parent.name AS parentname, IFNULL(GROUP_CONCAT(child.name),'') AS childname
FROM parentusers LEFT JOIN 
     parent ON parentusers.parent_id=parent.id LEFT JOIN 
     child sub ON parent.id=sub.parent_id
WHERE parentusers.user_id='1'
GROUP BY parent.id

我所做的修改(除了错误更正):

  1. 使用LEFT JOIN 连接表parentusersparent

  2. 添加了IFNULL,如果GROUP_CONCAT 为空,它将返回一个空字符串。

【讨论】:

  • 在你的查询父表中没有使用,但是parent.id在join中有
  • @user1851420:编辑了我的答案。
  • 我为用户 2 的孩子尝试了您的查询。名称不为空
  • @user1851420:它不是给出一个空字符串吗?
  • 如果用户在 childusers 表中不存在,则它不会为空,在您的查询中也没有与 childusers 表的连接
【解决方案2】:

最后我从下面的查询中得到了预期的结果

SELECT * FROM (SELECT parent.parentname AS parentname, 
parent.id AS parentid 
FROM parent,parentusers
WHERE parent.id=parentusers.parent_id
AND parentusers.user_id='2') parentdata
LEFT JOIN
(SELECT GROUP_CONCAT(child.childname SEPARATOR ',') AS childname,
GROUP_CONCAT(child.id SEPARATOR ',') AS childid
FROM parent

LEFT JOIN parentusers
ON parent.id=parentusers.parent_id

LEFT JOIN child
ON child.parent_id=parent.id
AND child.parent_id=parentusers.parent_id

LEFT JOIN childusers
ON child.id=childusers.child_id

AND childusers.user_id=parentusers.user_id
WHERE childusers.user_id='2' 
GROUP BY parent.id ) childdata
ON parentdata.parentid=childdata.childid

http://sqlfiddle.com/#!2/8ffaa/50

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2013-11-28
    • 2021-08-01
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多