[英]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.id
在ORDER BY
之前添加GROUP BY m.id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.