2012-12-04 12 views
5

Ho un problema riguardante l'unione di tabelle con group_concat. Ecco i dettagli.join tabella con più 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 

Ora quello che voglio ottenere è come questo:

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 

Questa è la mia query corrente:

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 

e qui è l'output:

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 

Se notate, cheeseburger ha 2 articolo e 2 annullata l'istruzione, ma l'uscita è 4, sguardi come se si stesse moltiplicando.

+1

Potete mettere la struttura in http://sqlfiddle.com/? – jcho360

+0

Penso che potresti aver digitato male qualcosa perché non ottengo lo stesso output con lo stesso input/query (in particolare ci sono due ord_id = 100); –

+0

Ciò è probabilmente dovuto alle regole 'GROUP BY 'di MySQL che agiscono su più gruppi di righe di quelli effettivamente visualizzati nell'output. Hai solo "GROUP BY order_id', ma hai altri" col "nel tuo" SELECT ". Correggi i dati come suggerito da @ExplosionPills e quindi possiamo aiutarti a risolvere la query. –

risposta

3

Dal momento che il join con cancelled_item_table moltiplica le righe, è necessario unire a un subquery già raggruppati, in questo modo:

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

che hai appena inchiodato, signore, grazie a tutti per il vostro aiuto, lo apprezzo molto. – WreckTangle

+0

Sto riscontrando un problema simile. Non credo che potresti espandere un po '(in termini di spiegazione) su cosa fa questa sub-query? Funziona, ma non capisco davvero perché. Inoltre questo non nega il vantaggio di avere una singola query invece di fare più query e foreach loop (php), dato che ora ci sono due query ?? Grazie –