2

table1、table2、table3の3つのテーブルがあります

他の2つのテーブルを左結合するtable1からselectクエリを作成します。選択には、table3から値を取得するgroup_concatがあります。特定の行を持つ行が存在しなくなるまで、すべてがうまく機能します。group_concatリストが空になります。代わりに、行が存在しないグループのgroup_concatの値をNULLに設定したいと思います。

私が言ったように、table3の値がtable2のすべての行に存在する場合、それは機能します。そうでない場合、group_concat全体が空になります。

私がこれまでに得たもののいくつかの「単純化された」コード:

SELECT 
    table1.table2Id,
    table1.dateAdded,

IF(COUNT(table2.table3Id) = COUNT(*), GROUP_CONCAT(table2.table3Id), NULL) as group1,
IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2
FROM table1
LEFT JOIN table2 ON
    table2.id = table1.table2Id
LEFT JOIN table3 ON
    table3.id = table2.table3Id
4

2 に答える 2

1

変更して修正しました

IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2

GROUP_CONCAT(IFNULL(table3.ext, NULL)) as group2
于 2013-01-05T18:49:40.783 に答える
0

結合を使用している状況では、結合で派生サブクエリを使用し、IFNULLを使用してデフォルト値を0に設定すると、外部テーブルでnullが発生した場合にこの値(0)が使用されます。

編集:

テストするデータがないため、このように実行できます。左結合の代わりに内部結合を使用します。

SELECT 
    table1.table2Id,
    table1.dateAdded,

IF(COUNT(table2.table3Id) = COUNT(*), GROUP_CONCAT(table2.table3Id), NULL) as group1,
IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2
FROM table1
INNER JOIN table2 ON
    table2.id = table1.table2Id
INNER JOIN table3 ON
    table3.id = table2.table3Id

また、派生したサブクエリを使用してみてください

SELECT 
    table1.table2Id,
    table1.dateAdded,
    IF(COUNT(t2.table3Id) = COUNT(*), GROUP_CONCAT(t2.table3Id), NULL) as group1,
    IF(COUNT(table3.ext) = COUNT(*), GROUP_CONCAT(table3.ext), NULL) as group2
FROM table1
LEFT JOIN (
            SELECT 
                id,
                IFNULL(table3Id,0) as table3Id,
                table3Id
            FROM table2
            GROUP BY id table3Id
            )as t2 ON t2.id = table1.table2Id
INNER JOIN table3 ON table3.id = t2.table3Id    
于 2013-01-05T18:06:52.397 に答える