5

我在使用 group_concat 加入表时遇到问题。这是详细信息。

表订单:

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           

表指令:

item_cd    instruction  
  3         more cheese  
  3         less vegetable  

取消项目表:

 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,看起来像是在相乘。

4

1 回答 1

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
于 2012-12-04T20:15:10.150 回答