找到最小值并包括正确的列值

时间:2016-05-04 12:06:24

标签: mysql sql group-by min

我正在尝试获得每次旅行的最低价格,并知道哪些旅行详细信息与每次旅行的最低价格相对应。

为此,我尝试了各种子查询,联接等变体,但由于没有1个主键,我无法弄明白。

我想要达到的目的是以最低价格获得旅行,然后以最低价格记录旅行的详细信息。

  SELECT travel_id, persons, days, MIN(`price`) AS `price` 
  FROM travel_details
  WHERE 1 
  GROUP BY `travel_id`
  HAVING MIN(price);

我的表格列的简单版本,列是: travel_idpersonsdaysprice

这些列一起构成主键。

可以为不同的人,天和价格预订旅行。对于travel_idpersonsdays的相同组合,还有多个价格选项。

如,

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_idpersons的所有组合。

知道如何处理这个问题吗?

3 个答案:

答案 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,这对你有用吗?