多个主键表上的MySQL分组查询

多个主键表上的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

我在具有两列主键的特定表中使用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     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条记录,因为它们是不同的值。谢谢!工作完美。