定价MySQL问题(分组依据)

时间:2018-02-15 23:21:38

标签: mysql group-by

问题概述

我们有一个网站,可以比较同一车型的多种不同价格,我们希望以最便宜的价格按升序显示模型。

模式

问题涉及三个表格(为便于理解而简化)

模型

Schema

以最便宜的价格订购模型

模型将有许多衍生品,每种衍生品都有很多价格。我们希望以任何衍生品的最低价格订购模型。

此查询

select `models`.name, `prices`.`rental` from `models` inner join 
`derivatives` on `derivatives`.`model_code` = `models`.`code` inner 
join `prices` on `prices`.`cap_id` = `derivatives`.`cap_id` order by 
`rental` asc limit 15 offset 0;

将导致以下(几乎正确)

result1

但显然我们只希望每个模型显示一个结果。如果我们尝试添加group by子句,则由于MySQL随机选择一个条目,因此最低价格会丢失。他们的文件解释说:

“但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。 “

https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html

所以这个查询

select `models`.name, `prices`.`rental` from `models` inner join 
`derivatives` on `derivatives`.`model_code` = `models`.`code` inner 
join `prices` on `prices`.`cap_id` = `derivatives`.`cap_id` group by 
`models`.`code` order by `rental` asc limit 15 offset 0;

结果如下所示,您可以看到SANDERO HATCHBACK显示的租金不是之前找到的最低租金

results2

1 个答案:

答案 0 :(得分:0)

select `models`.name, min(`prices`.`rental`) from `models` inner join 
`derivatives` on `derivatives`.`model_code` = `models`.`code` inner 
join `prices` on `prices`.`cap_id` = `derivatives`.`cap_id` group by 
`models`.`code` order by min(`rental`) asc limit 15 offset 0;

选择租借的最小值 - 这将显示结果中的最小值 按租赁的最低价值排序 - 这将把它放在结果中的正确位置。