[英]mysql query using MAX
我希望有一个人可以帮助我。 我看过其他线程,但找不到正确的答案。
我有一个包含以下数据的mysql数据库:
id, company, datefrom, dateto, rate, point1, point2
1, DHL, 2014-03-01, 2014-03-31, $1000, Paris, New York
2, MRW, 2014-03-01, 2014-03-31, $1300, Paris, New York
3, EXP, 2014-03-01, 2014-03-31, $1000, Paris, New York
4, DHL, 2014-03-06, 2014-03-31, $900, Paris, New York
5, FED, 2014-03-01, 2014-03-31, $1200, Paris, New York
我需要执行一个查询,在该查询中,基于日期,它将仅显示该日期之后的有效汇率。 例如,如果今天是2014-03-06,我需要结果是:
2, MRW, 2014-03-01, 2014-03-31, $1300, Paris, New York
3, EXP, 2014-03-01, 2014-03-31, $1000, Paris, New York
4, DHL, 2014-03-06, 2014-03-31, $900, Paris, New York
5, FED, 2014-03-01, 2014-03-31, $1200, Paris, New York
如您所见,记录1未显示为记录4替换了记录1(截至2014-03-06)
我尝试了以下查询,该查询有效:
SELECT id, company, MAX(datefrom), dateto, rate, point1, point2 FROM mydatabase
WHERE datefrom<='2014-03-06' and datefrom>='2014-03-06'
AND point1='Paris' AND point2='New York' GROUP BY company, point1, point2
除了选择DHL的所有公司之外,此查询的工作效果非常好,但对于DHL,它从记录1中选择所有字段,但从记录4中选择日期!
我究竟做错了什么?
利用mysql的非标准分组支持:
SELECT * FROM (
SELECT * FROM mydatabase
WHERE '2014-03-06' BETWEEN datefrom AND dateto
AND point1 = 'Paris'
AND point2 = 'New York'
ORDER BY datefrom DESC) x
GROUP BY company
这是通过首先在内部查询中按最新开始范围对匹配的行进行排序,然后对并非所有非聚合列进行分组来实现的,mysql为company
每个唯一值选择第一行,第一行是您想要的行(之前已订购)。
还请注意使用BETWEEN
的条件重做,它更优雅。
您需要在当前记录datefrom
之后添加带datefrom
的不存在记录的条件。
select * from mydatabase t1
WHERE '2014-03-06' between datefrom and dateto
AND NOT EXISTS
(
select 1 from mydatabase
where company=t1.company
AND point1 = t1.point1
AND point2 = t1.point2
AND '2014-03-06' between datefrom and dateto
AND datefrom>t1.datefrom
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.