2012-12-04 34 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

我認爲你可能錯誤的東西,因爲我沒有得到相同的輸入/相同的輸入/查詢(具體有兩個ord​​_id = 100); –

+0

這可能是由於MySQL的寬鬆的GROUP BY規則作用於比實際在輸出中看到的更多的行組。你只有'GROUP BY order_id',但你的'SELECT'中有其他的cols。修復@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),因爲現在有兩個查詢?謝謝 –