使用HAVING根据参考行

时间:2016-03-18 05:55:50

标签: mysql sql

我有下表:

+---------+--------------+----------+
| item_id | location_id  |  price   |
+---------+--------------+----------+
|       1 |            1 |      100 |
|       1 |            1 |      250 |
|       1 |            2 |       50 |
|       2 |            1 |      250 |
|       2 |            1 |     1000 |
|       3 |            1 |     1000 |
|       3 |            2 |      100 |
+---------+--------------+----------+

我可以使用此查询将此值降低到最小值

SELECT 
    item_id, location_id, MIN(price) AS Price
from
    table
GROUP BY item_id , location_id

这让我

+---------+--------------+----------+
| item_id | location_id  |  price   |
+---------+--------------+----------+
|       1 |            1 |      100 |
|       1 |            2 |       50 |
|       2 |            1 |      250 |
|       3 |            1 |     1000 |
|       3 |            2 |      100 |
+---------+--------------+----------+

我想进一步减少这种情况。我使用 location_id 为1的行作为参考行。对于具有与引用行的item_id匹配的item_id但具有不同位置ID的每一行。我想将该行的价格与参考行的价格进行比较。如果价格低于参考行的价格,我想过滤掉那一行。

我的最终结果应该包括每个商品ID的参考行以及符合价格标准低于参考行价格的任何行。

我有一种预感,我可以使用 HAVING 子句来执行此操作,但我在编译语句时遇到了问题。我该如何构建HAVING语句?

提前致谢

1 个答案:

答案 0 :(得分:1)

不,不能帮你这样,因为你需要过滤min()的结果

e.g:

select id,min(price) from table where date = '2016-3-18' group by id having min(price) = 50

它会显示min(price)= 50

的记录

让我们回到你的案例,有很多方法可以做到这一点,

<强> 1。左连接

select a.item_id,a.location_id,a.price
from table a 
left join table b
on a.location_id = b.location_id and a.price > b.price
where b.price is null

<强> 2。存在

select a.item_id,a.location_id,a.price
from table a
where exists(
select 1 from
(select location_id,min(price)as price from table group by location_id)b
where a.location_id = b.location_id and a.price = b.price
 )

通常我建议您使用exists