使用MAX的mysql查询

时间:2014-03-06 12:06:38

标签: mysql 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替换了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中选择日期!

我做错了什么?

2 个答案:

答案 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
)

SQLFiddle demo