Mysql查询使用日期获取最新数据

时间:2016-09-10 14:06:09

标签: mysql sql date aggregate-functions

enter image description here

这是我的桌子。现在我必须找出每个user_id的最新company_name。事实是,如果exp_to为null,那么它将被认为是最新的,或者如果exp_from和amp; exp_to不为null然后我必须使用exp_to日期找到最新的公司名称。请注意,user_id在给定表中多次出现。

这就是我想要的:

id | company_name 
-----------------
14 | Deltalife Insurance Company Ltd.
1  | Orbital Software
25 | MMTV    
18 | Noakhali Science & Technology University
等等...... 我怎么能用mysql做到这一点?提前致谢。

3 个答案:

答案 0 :(得分:1)

根据您提供的任何信息,我可以找出此查询

Select * from Table_Name where exp_to = null || exp_to = (select max(exp_to) from Table_Name)

答案 1 :(得分:1)

这是结构化查询语言的结构化部分的应用程序。

首先,您需要知道每个user_id的最新日期。该子查询产生该信息:

       SELECT user_id,
              MAX(IFNULL(NOW(), exp_to) exp_to
         FROM mytable
        GROUP BY user_id

然后,您需要使用该结果查找公司,方法是将其加入您的表格。

SELECT a.user_id, a.company_name
  FROM mytable a
  JOIN (
            SELECT user_id,
                   MAX(IFNULL(NOW(), exp_to) exp_to
              FROM mytable
             GROUP BY user_id
       ) b ON a.user_id = b.user_id AND IFNULL(NOW(), a.exp_to) = b.exp_to

这应该找到与每个exp_to的最新user_id相关联的公司名称。 IFNULL(NOW(),exp_to)实现了您的要求,即将NULL日期视为当前时间。

此查询是一般查询模式的示例:查找具有特定值的极值(最大值,最小值)的行。

答案 2 :(得分:1)

这是非常简单的聚合问题。您可能已经想到,null会导致SQL中的some interesting behavior。您可以使用CASE WHEN检查null并替换为其他值。

在你的情况下:

SELECT 
  data.* 
FROM (
  SELECT 
    *,
    CASE WHEN exp_to is null THEN 1 ELSE exp_to END max_date
  FROM your_table
) data
INNER JOIN (
  SELECT
    user_id,
    CASE WHEN MAX(exp_to is null) = 1 THEN 1 ELSE MAX(exp_to) END max_date
  FROM
    your_table
  GROUP BY user_id
) j
ON data.user_id = j.user_id AND data.max_date = j.max_date

希望这有帮助,祝你好运!