我有下表:
+---------+--------------+----------+
| 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语句?
提前致谢
答案 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