2012-12-04 23 views
5

Grup_koncat ile tabloları birleştirmekle ilgili bir sorunum var. Detaylar burada.tablonun birden fazla group_concat ile birleştirilmesi

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: Artık

quantity seq_no 
    1  234 
    1  234 
    1  235 

ne elde etmek istiyorsunuz şu şekildedir:

, Bakışlar

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 

Dikkat edilirse cheeseburger 2 iptal madde ve 2 talimat vardır, ama çıkış 4'tür: 0

Bu benim şimdiki sorgu geçerli: Burada

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 

ve çıkışı çarpıyor gibi.

+1

sen http://sqlfiddle.com/ yapıyı yerleştirebilir miyim? – jcho360

+0

Sanırım bir şeyi yanlış yazmış olabilirsiniz çünkü aynı çıktıyı aynı girdi/sorgu ile alamıyorum (özellikle iki ord_id = 100 var); –

+0

Bu, büyük olasılıkla MySQL'in “GROUP BY” kurallarının, çıktıda gerçekten göründüğünüzden daha fazla satır grubu üzerinden hareket etmesinden kaynaklanmaktadır. "GROUP BY order_id" var, ancak "SELECT" inizde başka cols var. Verileri @ExplosionPills tarafından önerilen şekilde düzeltin ve sonra sorguyu çözmeye yardımcı olabiliriz. –

cevap

3

cancelled_item_table çarpar satırlarla katılmak beri böyle, zaten gruplandırılmış alt sorgu için katılmak zorunda:

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

'u kullanmayı denediniz, sadece siz bayıldınız, yardımlarınız için herkese teşekkürler, çok teşekkür ediyorum. – WreckTangle

+0

Benzer bir sorun yaşıyorum. Bu alt sorgunun ne yaptığıyla ilgili olarak (açıklama açısından) biraz genişleyebileceğinizi sanmıyorum. Çalışıyor ama nedenini anlamıyorum. Ayrıca bu iki sorgu olduğundan, çoklu sorgulama ve foreach döngüler (php) yapmak yerine tek bir sorguya sahip olmanın avantajını da ortadan kaldırmaz mı? Teşekkürler –