繁体   English   中英

MySQL:为什么GROUP_CONCAT在我的多联接查询中丢失行?

[英]MySQL: why does GROUP_CONCAT lose rows in my multiple join query?

我正在尝试从table_m中获取所有行,其中table_mi中也有一个索引,因此我希望得到2行(m.id = 3和m.id = 9)-但是如果我添加GROUP_CONCAT按我的选择,那么我只会返回一行。 我的那些联接中某处是否发生了事故?

查询:

SELECT 
    m.id,
    m.name,
    m.keyword,
    IFNULL(GROUP_CONCAT(r.keyword),'TEST') AS restrictions
FROM 
    table_m AS m 
INNER JOIN
    table_mi as mi ON m.id=mi.m_id
LEFT JOIN
    table_ri as ri ON m.id=ri.m_id
LEFT JOIN
    table_r AS r ON ri.r_id=r.id
WHERE 
    (
        m.id>0
        AND m.active=1  
        AND mi.p_id=0
        AND (mi.pa_id="11" OR (mi.pa_id=0 AND mi.id!=0)) 
        AND mi.u_id=IF((SELECT id FROM table_mi WHERE p_id=0 AND pa_id="11" AND u_id="2")>0,"2",0)
    ) OR mi.id=0 
ORDER BY
    mi.priority;

这就是我得到的结果:

ID  NAME    KEYWORD RESTRICTIONS
9   test_a  key_a   r_key_2,r_key_3,r_key_4

这是我所期望的:

ID  NAME    KEYWORD RESTRICTIONS
9   test_a  key_a   r_key_2,r_key_3,r_key_4
3   test_b  key_b   TEST

请参阅我在sql小提琴上具有架构的完整示例: http ://sqlfiddle.com/#!2/359d9/1

GROUP_CONCAT是一个聚合函数。 除非您指定GROUP BY子句,否则它将带回一行(除非GROUP BY子句中的任何字段均为聚合字段)

在ORDER BY之前添加以下内容:

GROUP BY m.id,  m.name, m.keyword

也就是说,您似乎可能想使用CONCAT将2个值连接在一起,而不是GROUP_CONCAT

顺便说一句,如果取消子选择,则SQL可能更易于阅读。 假设它带回一条记录,则可能如下

SELECT 
    m.id,
    m.name,
    m.keyword,
    IFNULL(GROUP_CONCAT(r.keyword),'TEST') AS restrictions
FROM 
    table_m AS m 
INNER JOIN
    table_mi as mi ON m.id=mi.m_id
LEFT JOIN
    table_ri as ri ON m.id=ri.m_id
LEFT JOIN
    table_r AS r ON ri.r_id=r.id
LEFT OUTER JOIN 
    table_mi AS mi2 ON mi2.p_id=0 AND mi2.pa_id="11" AND mi2.u_id="2"
WHERE 
    (
        m.id>0
        AND m.active=1  
        AND mi.p_id=0
        AND (mi.pa_id="11" OR (mi.pa_id=0 AND mi.id!=0)) 
        AND mi.u_id=IF(mi2.id >0,"2",0)
    ) OR mi.id=0 
ORDER BY
    mi.priority;

您不需要GROUP_CONCAT即可实现所需的功能。

代替 :

IFNULL(GROUP_CONCAT(r.keyword),'TEST') AS restrictions

采用

IFNULL(r.keyword,'TEST') AS restrictions

要么:

保持查询GROUP BY m.idORDER BY之前添加GROUP BY m.id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM