我希望有人可以帮助我。 我看过其他帖子,但我找不到合适的答案。
我有一个包含以下数据的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替换了2014-03-06的记录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中选择日期!
我做错了什么?
答案 0 :(得分:1)
利用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为每个唯一值{选择第一个行。 {1}},第一行是您想要的那一行(之前已经订购过)。
还要注意使用更优雅的company
条件的重新处理。
答案 1 :(得分:0)
您需要在当前记录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
)