MySQL选择不在分组的行

时间:2019-07-17 14:21:14

标签: mysql sql

我有以下示例数据的MySQL表:

    create table prices (
      id INTEGER PRIMARY KEY AUTO_INCREMENT,
      store_id INTEGER NOT NULL,
      item INTEGER NOT NULL,
      price FLOAT NOT NULL
    );

    insert into prices values(1,1,1,1.25);
    insert into prices values(2,1,2,.99);
    insert into prices values(3,2,2,1.20);
    insert into prices values(4,3,3,3.25);
    insert into prices values(5,3,1,1.35);

我正在寻找一个查询,以选择公司不用于购买产品的任何store_id。例如,在prices中,将不会使用store_id 2,因为可以从item 1便宜地购买store_id 2。

我将如何处理?谢谢。

2 个答案:

答案 0 :(得分:2)

使用此查询:

select item, min(price) minprice
from prices
group by item

您将获得每件商品的最低价格。
如果您对上面的查询left joinprices select p.* from prices p left join ( select item, min(price) minprice from prices group by item ) g on g.item = p.item and g.minprice = p.price where g.item is null 并仅保留不匹配的行(表示该商品的价格没有最便宜的行),则将获得所有该商品的商店和商品可以发现更便宜:

| id  | store_id | item | price |
| --- | -------- | ---- | ----- |
| 3   | 2        | 2    | 1.2   |
| 5   | 3        | 1    | 1.35  |

请参见demo
结果:

select p.store_id
from prices p left join (
  select item, min(price) minprice
  from prices
  group by item
) g on g.item = p.item and g.minprice = p.price
group by p.store_id
having sum(g.item is not null) = 0

如果您只想要从以下商店不买任何东西的商店:

| store_id |
| -------- |
| 2        |

请参见demo
结果:

SELECT * FROM DATASET ORDER BY Timestamp desc Limit 100

答案 1 :(得分:0)

SELECT *, MIN(price) from prices group by item

为您提供商品最便宜的 store_id

示例输出:

  

id | store_id |项目|价格| MIN(价格)

     

1 | 1 | 1 | 1.25 | 1.25

     

2 | 1 | 2 | 0.99 | 0.99

     

4 | 3 | 3 | 3.25 | 3.25