多个主键表上的MySQL分组查询
我在具有两列主键的特定表中使用GROUPBY查询时遇到问题 我的桌子看起来像这样:多个主键表上的MySQL分组查询,mysql,group-by,Mysql,Group By,我在具有两列主键的特定表中使用GROUPBY查询时遇到问题 我的桌子看起来像这样: CREATE TABLE IF NOT EXISTS `stocks` ( `id_city` int(10) NOT NULL, `id_prod` int(10) NOT NULL, `sell_price` int(10) DEFAULT '0', PRIMARY KEY (`id_city`,`id_prod`) ) id_prod
CREATE TABLE IF NOT EXISTS `stocks` (
`id_city` int(10) NOT NULL,
`id_prod` int(10) NOT NULL,
`sell_price` int(10) DEFAULT '0',
PRIMARY KEY (`id_city`,`id_prod`)
)
id_prod id_city MIN(sell_price)
1 3 10
假设它插入了这样的值:
INSERT INTO `stocks` (`id_city`, `id_prod`, `sell_price`)
VALUES ('1', '1', '100'), ('2', '1', '90'), ('3', '1', '10');
询问后:
SELECT id_prod, id_city, MIN(sell_price)
FROM stocks
GROUP BY id_prod
结果行松开“id\u city”键-它取城市id的第一个出现
id_prod id_city MIN(sell_price)
1 1 10
如何为这种情况构建适当的查询?结果应该如下所示:
CREATE TABLE IF NOT EXISTS `stocks` (
`id_city` int(10) NOT NULL,
`id_prod` int(10) NOT NULL,
`sell_price` int(10) DEFAULT '0',
PRIMARY KEY (`id_city`,`id_prod`)
)
id_prod id_city MIN(sell_price)
1 3 10
您还必须将
id\u city
添加到groupby
子句中
如果要返回包含
min(售价)
的记录,可以使用子查询:
SELECT s1.id_prod,
s1.id_city,
s1.sell_price
FROM stocks s1
inner join
(
select id_prod, MIN(sell_price) sell_price
from stocks
group by id_prod
) s2
on s1.id_prod = s2.id_prod
and s1.sell_price = s2.sell_price
看
这将返回:
| ID_PROD | ID_CITY | SELL_PRICE |
----------------------------------
| 1 | 3 | 10 |
你的意思是使用
max(id\u city)
或者使用count(id\u city)
双方都返回
ID_PROD CITY MIN(SELL_PRICE)
1 3 10
编辑
通过internaljoin
SELECT s.id_prod,
s.id_city,
s.sell_price
FROM stocks s
inner join
(
select id_prod, MIN(sell_price) sell_price
from stocks
group by id_prod
) s1
on s.id_prod = s1.id_prod
and s.sell_price = s1.sell_price
数字3代表什么?最后一个id或计数(如果是id\u city)?否。我想返回“id\u city”,它对某些产品具有最低的“售价”。现在它可以正常工作。看起来几乎与@bluefeet;)相同。谢谢你的两个答案!这将返回由id_city分隔的所有记录。我希望有一个具有适当id_city的产品的最低价格记录。在这种情况下,请参阅@bluefeet answer。我相信这是最棒的!这是唯一的解决办法还是我的查询不能用“分组依据”完成?在你的情况下不是这样。如果您仅按
ID\u PROD
分组,则无法保证将返回哪个ID\u city
。您不能按id\u city分组,因为您将返回所有3条记录,因为它们是不同的值。谢谢!工作完美。