2012-12-04 11 views
5

group_concatでテーブルを結合する際に問題があります。ここに詳細があります。複数のgroup_concatを持つテーブルの結合

table_orders:

item_cd order_id descs   quantity status seq_no 
1   100  coca-cola   2   A   232 
2   100  pizza    1   A   233 
3   101  cheeseburger  5   A   234 
4   102  pepsi    4   A   235 
4   

table_instructions:

item_cd instruction 
    3   more cheese 
    3   less vegetable 

cancelled_item_table:

quantity seq_no 
    1  234 
    1  234 
    1  235 

今、私が達成したいものを、このようなものです:

item_cd descs   quantity instructions     cancelled_item 
1   coca-cola   2  -         - 
2   pizza    1  -         - 
3   cheeseburger  2  more cheese, less vegetable  1,1 
4   pepsi    4  -         1 

これは私の現在のクエリです:

SELECT 
    ord.item_cd, 
    ord.order_id, 
    ord.descs, 
    ord.quantity, 
    GROUP_CONCAT(x.quantity) as cancelled, 
    GROUP_CONCAT(i.instruction) as instruct 
FROM table_orders ord 
LEFT JOIN cancelled_item_table x ON ord.seq_no = x.seq_no 
LEFT JOIN table_instructions i ON ord.item_cd = i.item_cd  
WHERE ord.status = 'A' 
GROUP BY ord.order_id 

、ここでは出力されます:

item_cd descs   quantity instructions     cancelled_item 
1   coca-cola   2  -         1 
2   pizza    1  -         1 
3   cheeseburger  2  more cheese, more cheese, 
            less vegetable, less vegetable 1,1,1,1 
4   pepsi    4  -         1 

あなたが気付いた場合、チーズバーガーは2キャンセル項目と2命令を持っていますが、出力は4で、ルックスそれが倍増しているように。

+1

あなたはhttp://sqlfiddle.com/に構造を配置することはできますか? – jcho360

+0

私は同じ入力/クエリ(特に2つのord_id = 100)で同じ出力を得られないので、あなたは何かミスタイプするかもしれないと思います。 –

+0

これは、MySQLの寛大な 'GROUP BY'ルールが実際に出力よりも多くの行グループに作用するためです。あなたは 'GROUP BY order_id'しか持っていませんが、' SELECT'に他のcolを持っています。 @ExplosionPillsで提案されているようにデータを修正すると、クエリを実行するのに役立ちます。 –

答えて

3

cancelled_item_table乗算行に参加するので、あなたはこのように、既にグループ化されたサブクエリに参加する必要があります。

SELECT 
    ord.item_cd, 
    ord.order_id, 
    ord.descs, 
    ord.quantity - coalesce(x.tot,0) as quantity, 
    GROUP_CONCAT(i.instruction) as instruct, 
    x.cancelled 
FROM 
    table_orders ord LEFT JOIN table_instructions i 
    ON ord.item_cd = i.item_cd LEFT JOIN 
    (select seq_no, count(*) as tot, GROUP_CONCAT(quantity) as cancelled 
    from cancelled_item_table 
    group by seq_no) x ON ord.seq_no = x.seq_no 
WHERE ord.status = 'A' 
GROUP BY ord.item_cd, ord.order_id, ord.descs, quantity 
+0

あなたはあなたの助けをくれた皆さん、ありがとうと思います。 – WreckTangle

+0

私は同様の問題を抱えています。私はあなたがこのサブクエリが何をするかについて(説明の点で)少し​​拡大することはできないと思いませんか?それは動作しますが、なぜ私は本当に理解できません。また、複数のクエリとforeachループ(php)を実行するのではなく、1つのクエリを持つ利点を否定しません。ありがとう –