2013-07-05 29 views
0

我試圖從table_m中獲取table_m中的所有行,這些行在table_mi中也有一個索引,我期望得到2行作爲結果(使用m.id = 3和m.id = 9) - 但是如果我將GROUP_CONCAT添加到我的select中,然後我只返回一行。我在我的那些聯盟中有什麼地方出現了一個錯誤?MySQL:爲什麼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

回答

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; 
+0

+1添加GROUP BY m.id爲'GROUP_CONCAT '說明 – Stephan

+0

謝謝,GROUP BY幫了我很多:D(也編輯了我的例子來說明爲什麼我想使用GROUP_CONCAT更好一些) –

1

你這樣做沒有必要GROUP_CONCAT達到你想要的東西。

相反的:

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

使用

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

OR:

請查詢,因爲它是和之前ORDER BY

相關問題