0

我正在尝试从 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 名称关键字限制
9 test_a key_a r_key_2,r_key_3,r_key_4

这就是我所期待的:

ID 名称关键字限制
9 test_a key_a r_key_2,r_key_3,r_key_4
3 test_b key_b 测试

请在 sql fiddle 上查看我的完整示例:http ://sqlfiddle.com/#!2/359d9/1

4

2 回答 2

3

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;
于 2013-07-05T08:58:54.587 回答
1

你不需要GROUP_CONCAT达到你想要的。

代替 :

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

采用

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

或者:

保持查询原样并在GROUP BY m.id之前添加ORDER BY

于 2013-07-05T08:59:13.840 回答