在mysql查询中使用concat_group

时间:2012-03-16 02:14:40

标签: mysql group-concat

这是我的表定义:

CREATE TABLE orders_total (
  orders_total_id int unsigned NOT NULL auto_increment,
  orders_id int NOT NULL,
  title varchar(255) NOT NULL,
  text varchar(255) NOT NULL,
  value decimal(15,4) NOT NULL,
  class varchar(32) NOT NULL,
  sort_order int NOT NULL,
  PRIMARY KEY (orders_total_id),
  KEY idx_orders_total_orders_id (orders_id)
);

填充的表格看起来像这样(我记忆中所有已编号的数字):

1 - 13 - Shipping - $7.50   - 7.50   - ot_shipping - 2
2 - 13 - Tax      - $8.00   - 8.00   - ot_tax      - 4
3 - 13 - Total    - $56.67  - 56.67  - ot_total    - 3
4 - 14 - Shipping - $5.55   - 5.55   - ot_shipping - 2
5 - 14 - Discount - $6.40   - 6.40   - ot_discount - 1
6 - 14 - Coupon   - $10.00  - 10.00  - ot_coupon   - 5
7 - 14 - Total    - $150.25 - 150.25 - ot_total    - 3

每个订单都可以有不同的类,并非所有订单都必须具有确切的类数。例如:

  1. 订单1可以包含以下类:ot_shipping,ot_tax,ot_total
  2. 订单2可以包含以下类:ot_shipping,ot_discount,ot_coupon,ot_total
  3. ...
  4. 我想写一个查询我的订单表的查询(这里没有显示),并加入上面的表(orders_total),只有当“class”为“ot_total”时才抓取“value”列, “ot_coupon”或“ot_discount”。

    以下是我尝试创建此类查询:

    SELECT o.orders_id, o.customers_name, group_concat(ot.value) AS values
    FROM orders o
    LEFT JOIN orders_total ot
    ON ot.orders_id = o.orders.id
    GROUP BY o.orders_id
    

    以上查询会产生如下内容:

    第一组结果:

    orders_id      => 13
    customers_name => John Doe
    values         => 7.50,8.00,56.67
    

    第二组结果:

    orders_id      => 14
    customers_name => Jane Roe
    values         => 5.55,6.40,10.00,150.25
    

    正如你所看到的,这些值给了我所需要的东西,但我不知道哪个数字属于哪个类。我只对ot_total,ot_discount和ot_coupon感兴趣。

    任何人都可以想到任何解决方案?

    是否有可能以某种方式将类名附加到值?所以我可以有类似值=> ot_shippimh7.50,ot_tax8.00,ot_total56.67

1 个答案:

答案 0 :(得分:0)

你可以这样做:

SELECT o.orders_id, o.customers_name,
       GROUP_CONCAT(CONCAT( ot.class, ot.value)) AS values
FROM orders o
LEFT JOIN orders_total ot
ON ot.orders_id = o.orders.id
WHERE ot.class in ("ot_total", "ot_coupon", "ot_discount")
GROUP BY o.orders_id

BTW:您可以通过从orders_total中删除类字段来做得更好,添加一个名为Classes的新表,而不是包含类列表然后添加一个对此表格的外键引用到orders_total