0

table_mi にもインデックスがある table_m からすべての行をフェッチしようとしていますが、結果として 2 つの行を取得することを期待しています (m.id=3 および m.id=9) - しかし、GROUP_CONCAT を追加すると私の選択では、1行しか返されません。私はそれらの結合のどこかで事故を起こしていますか?

クエリ:

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 キーワードの制限
9 test_a key_ar_key_2,r_key_3,r_key_4

これは私が期待しているものです:

ID NAME キーワードの制限
9 test_a key_ar_key_2,r_key_3,r_key_4
3 test_b キー_b テスト

SQLフィドルのスキーマを使用した私の完全な例をご覧ください: 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

つまり、GROUP_CONCAT ではなく CONCAT を使用して 2 つの値を結合することをお勧めします。

余談ですが、サブセレクトを削除すると、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 に答える