我有一个包含各种租车价格的数据集。数据包括:
我需要查询这些数据以获得每类最便宜的价格,但我还需要从数据库中有多个结果的地方选择最近的价格,即使最近的价格比旧数据更贵。 。
例如,我可能有这样的数据:
我想运行一个可以获取以下数据的查询:
如果我执行查询,例如:
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字段存储所有时间数据。
答案 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)