我希望有人能帮我。我看过其他线程,但找不到正确的答案。
我有一个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如您所见,在2014-03-06年度,记录4取代记录1时,不显示记录1。
我尝试了以下查询,该查询成功了:
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之外的所有公司,它从记录1中选择所有字段,从记录4中选择日期!
我做错了什么?
发布于 2014-03-06 12:15:28
利用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的条件的重新处理,这是更优雅的。
https://stackoverflow.com/questions/22224016
复制相似问题