我正在尝试获得每次旅行的最低价格,并知道哪些旅行详细信息与每次旅行的最低价格相对应。
为此,我尝试了各种子查询,联接等变体,但由于没有1个主键,我无法弄明白。
我想要达到的目的是以最低价格获得旅行,然后以最低价格记录旅行的详细信息。
SELECT travel_id, persons, days, MIN(`price`) AS `price`
FROM travel_details
WHERE 1
GROUP BY `travel_id`
HAVING MIN(price);
我的表格列的简单版本,列是:
travel_id
,persons
,days
,price
这些列一起构成主键。
可以为不同的人,天和价格预订旅行。对于travel_id
,persons
和days
的相同组合,还有多个价格选项。
如,
100, 2, 4, **250**
100, 2, 4, **450**
100, 2, **5**, 450
101, 2, 4, 190
101, 2, 5, 185
4人2人travel_id
100。
我想要实现的是返回: 100,250,然后使用正确的相应值:
100,2,4,250
101,2,5,185
现在我的结果只是混合了所有其他数据。当我在组中包含这些列时,它不仅会再分组travel_id
,还会分组在persons
上。然后,它会返回travel_id
和persons
的所有组合。
知道如何处理这个问题吗?
答案 0 :(得分:1)
Select a.travel_id, a.persons, a.days, a.price from travel_details a
JOIN (Select travel_id,MIN(Price) as p from travel_details group by travel_id) b
on b.travel_id=a.travel_id and b.p=a.price
以上查询使用自联接。派生表b将包含travel_id和最低价格。
答案 1 :(得分:0)
您可以使用IN()
执行此操作:
SELECT * FROM travel_details t
WHERE (t.travel_id,t.price) IN(SELECT s.travel_id,min(s.price)
FROM travel_details s
GROUP BY s.travel_id)
GROUP BY t.travel_id; // this last group-by is to filter doubles when there are multiple records per travel with the lowest price.
答案 2 :(得分:0)
SELECT travel_id, persons, days, price
FROM (
SELECT
ROW_NUMBER() OVER(PARTITION BY travel_id, persons, days ORDER BY price) AS RowNum,
travel_id, persons, days, price
FROM travel_details
) X
WHERE X.RowNum = 1
你好@PeterH,这对你有用吗?