Mysql:按书名分组(但也按最后更新的费用)

时间:2015-02-14 15:35:11

标签: mysql sql

我需要显示客户(ID)通常消费的所有产品,有些产品有特价。当然,客户可以再次购买相同的产品,但可能还有其他价格。

Structure orders table
CREATE TABLE orders (
order_id mediumint(8) unsigned not null auto_increment,
cl_id mediumint(8) unsigned not null default '0',
order_date int(10) unsigned not null default '0',
order_note varchar(255) not null default '',
PRIMARY KEY (order_id),
KEY cl_id (cl_id)
);

所以,这是我的sql:

SELECT cl.cl_name, or.order_id, pro.pro_name, detal.detal_price
FROM consumers cl
LEFT JOIN orders or
ON cl.cl_id = or.cl_id
LEFT JOIN order_detail detal
ON or.order_id = detal.order_id
LEFT JOIN products pro
ON detal.pro_id = pro.pro_id
WHERE cl.cl_id = 5
GROUP BY pro.pro_name

好的,我使用" group by"不要重复相同的产品名称。但我需要显示价格,但最后更新价格。我认为需要使用" order_date",但我需要一些帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用substring_index() / group_concat()技巧获取最后价格:

SELECT c.cl_name, p.pro_name,
       substring_index(group_concat(d.detal_price order by order_date desc), ',', 1) as MostRecentPrice
FROM consumers cl LEFT JOIN
     orders o
     ON c.cl_id = o.cl_id LEFT JOIN
     order_detail detal
     ON o.order_id = d.order_id LEFT JOIN
     products p
     ON d.pro_id = p.pro_id
WHERE c.cl_id = 5
GROUP BY c.cl_name, p.pro_name;

我对查询做了一些其他更改:

  • 修复了表别名。因为or是SQL中的关键字,所以对于表别名来说它是一个糟糕的选择。我把所有这些都缩短了。
  • c.cl_name添加到group by。这在MySQL中不是必需的,但在其他方言中也是如此。另外,避免查询错误是一个好习惯。
  • 已移除order_id。这在您的查询中毫无意义,因为您没有在订单级别进行聚合。