Mysql:按图书名称分组(但也按上次更新的成本)
我需要显示客户(ID)通常消费的所有产品,有些产品有特殊价格。当然,客户可以再次购买相同的产品,但可能需要另一个价格Mysql:按图书名称分组(但也按上次更新的成本),mysql,sql,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 def
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
好的,我使用“分组方式”来避免重复相同的产品名称。但我也需要显示价格,但最后更新的价格。我认为需要使用“订单日期”,但我需要一些帮助。您可以使用
子字符串\u index()
/组\u 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;
我对查询做了一些其他更改:
- 修复了表别名。因为
是SQL中的关键字,所以对于表别名来说,这是一个错误的选择。我把它们都短路了或
- 将
添加到c.cl\u名称
。这在MySQL中是不需要的,但在其他方言中是需要的。另外,避免查询中的错误也是一个好习惯分组依据
- 已删除订单id。这在查询中是毫无意义的,因为您不是在订单级别进行聚合