我需要显示客户(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",但我需要一些帮助。
答案 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
。这在您的查询中毫无意义,因为您没有在订单级别进行聚合。