2012-12-04 14 views
5

Mam problem z łączeniem tabel z group_concat. Oto szczegóły.Tabela łączy się z wieloma 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 

Teraz to, co chcę osiągnąć jest tak:

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 

To jest mój obecny zapytania:

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 

i tu jest wyjście:

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 

Jeśli zauważysz, cheeseburger ma 2 anulowane dyspozycję artykuł i 2, ale wyjście jest 4, wygląd jak to się rozmnaża.

+1

można umieścić strukturę w http://sqlfiddle.com/? – jcho360

+0

Myślę, że możesz mieć błędnie wpisane coś, ponieważ nie mam tego samego wyjścia z tego samego wejścia/zapytania (konkretnie są dwa ord_id = 100); –

+0

Jest to prawdopodobnie spowodowane łagodnymi regułami 'GROUP BY' MySQL działającymi na więcej grup wierszy niż faktycznie widzisz w wynikach. Masz tylko 'GROUP BY order_id', ale masz inne cols w swoim' SELECT'. Napraw dane zgodnie z sugestiami @ExplosionPills, a następnie pomożemy opracować zapytanie. –

Odpowiedz

3

Ponieważ przyłączyć cancelled_item_table mnoży rzędach, trzeba dołączyć do już zgrupowane podzapytania, podobnie jak to:

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

właśnie go przybiłeś, dziękuję wszystkim za twoją pomoc, doceniam to tak bardzo. – WreckTangle

+0

Mam podobny problem. Nie sądzę, że mógłbyś nieco rozszerzyć (w zakresie wyjaśnień), co robi to pod-zapytanie? Działa, ale tak naprawdę nie rozumiem dlaczego. Czyni to również nie neguje korzyści z posiadania pojedynczego zapytania, w przeciwieństwie do wykonywania wielu zapytań i pętli foreach (php), ponieważ istnieją teraz dwa zapytania? Dzięki –

Powiązane problemy