繁体   English   中英

使用MAX的mysql查询

[英]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
)

SQLFiddle演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM