MySQL查询以获得每个分类的最新和最便宜的项目

时间:2010-12-22 16:32:04

标签: sql mysql aggregate

我有一个包含各种租车价格的数据集。数据包括:

  • 汽车类(紧凑型,小型货车,suv等),
  • 出租价格,
  • 收集数据的日期。

我需要查询这些数据以获得每类最便宜的价格,但我还需要从数据库中有多个结果的地方选择最近的价格,即使最近的价格比旧数据更贵。 。

例如,我可能有这样的数据:

  • 班级,价格,日期
  • suv,100,今天
  • suv,121,今天
  • suv,49,3天前
  • minivan,89,昨天
  • minivan,120,昨天
  • minivan,100,昨天
  • minivan,91,3天前
  • minivan,77,3天前

我想运行一个可以获取以下数据的查询:

  • suv,100,今天
  • minivan,89,昨天

如果我执行查询,例如:

SELECT * FROM data
ORDER BY class, date DESC, price;

然后每个类的最顶行包含正确的数据。我只需要知道如何让数据库只返回那些行并丢弃其余的行。

我正在使用一个相当严重锁定的MySQL数据库,并且创建临时表不是一种选择。

已更新以添加:

以上是正在运行的reql查询的高度简化版本。真正的查询确实连接了几个表,看起来更像是这样:

SELECT hc.companyname AS supplier, 
sr.pricedetails AS price, 
sr.matchedsipp AS class,
sr.cardetails AS cardetails,
CAST(sj.jobdate AS DATE) AS jobdate 
FROM searchdetails sd 
STRAIGHT_JOIN searchresults sr ON (
    sd.taskid = sr.taskid 
    AND sd.locationid = sr.locationid 
    AND sd.jobid = sr.jobid 
    AND sd.companyid = sr.companyid
) 
JOIN hirecompanies hc ON sr.companyid = hc.companyid 
JOIN locations lc ON lc.locationid = sd.locationid 
JOIN searchjobs sj ON sr.jobid = sj.jobid 
WHERE DATE(sd.pudate) = '2010-12-28' 
AND DATE(sd.dodate) = '2011-01-04' 
AND hc.countrycode = 'GB' 
AND lc.iata = 'MAN';

pudate是接送日期,而dodate是下降日期。使用DATETIME字段存储所有时间数据。

5 个答案:

答案 0 :(得分:3)

这应该是每种车型最近搜索日期的最低价格:

 SELECT * FROM data D1
   WHERE NOT EXISTS
      (SELECT * FROM data D2 WHERE D2.class = D1.class
                             AND (D2.date > D1.date 
                             OR (D2.date = D1.date AND D2.price < D1.price)))

你有多少数据(这对大量数据不会特别有效)?

答案 1 :(得分:1)

如何使用LIMIT 1使用多个SELECT,然后使用UNION?这样,您可以组合不同的ORDER BY,并且每个特定查询仍然只能获得1行。

答案 2 :(得分:0)

这样的东西?

SELECT class, date, MIN(price) 
FROM data 
WHERE (class, date) IN 
    (SELECT class, MAX(date) FROM data GROUP BY class)

答案 3 :(得分:0)

SELECT  t.*
FROM    (
        SELECT  class, MAX(date) AS maxdate
        FROM    mytable
        GROUP BY
                class
        ) td
JOIN    mytable t
ON      t.id = 
        (
        SELECT  id
        FROM    mytable ti
        WHERE   ti.class = td.class
                AND ti.date = td.maxdate
        ORDER BY
                ti.class, ti.date, ti.price, ti.id
        LIMIT 1
        )

mytable (class, date, price, id)上创建一个索引,以便快速工作。

答案 4 :(得分:0)

获取每班最新价格

SELECT
*,
FROM data
GROUP BY class
HAVING date=max(date)

外,最低价格相同
HAVING price=min(price)

然后,如果你想要最多的价格,当多个人有最新的日期时

HAVING date=max(date) AND price=min(price)