【问题标题】:MySQL - How can I SELECT rows with MAX dateMySQL - 我如何选择具有 MAX 日期的行
【发布时间】:2014-08-06 12:54:10
【问题描述】:

我的桌子是:

id_clocking | project_id | date       | comments        | next_steps | dependencies
1           | 39         | 2014-08-01 | new_com         | step1      | dependency1
2           | 39         | 2014-08-10 | NULL            | step2      | NULL
3           | 39         | 2014-08-12 | NULL            | step3      | dependencyx
4           | 39         | 2014-08-05 | commentx        | stepx      | depend
5           | 42         | 2014-07-15 | NULL            | NULL       | dependency_3
6           | 42         | 2014-07-03 | comment_3       | step_c     | dependency_4
7           | 42         | 2014-08-01 | NULL            | step_d     | NULL            

我需要通过选择最新的 cmets、next_steps、保存每个 project_id 日期最大值的依赖项来从 MySQL 数据库创建 PHP 输出

结果是:

 project_id | comments  | next_steps | dependencies
 ------------ ------------------------------------
    39      | commentx  | step3      | dependencyx
    42      | comment_3 | step_d     | dependency_3

并且应该仅返回具有基于可用的最高日期的值的行(我们有 ----- 没有值并且不应考虑该行) 你能分享你的想法吗?

【问题讨论】:

  • 并且应该只返回基于可用的最高日期的值的行(我们有 ----- 没有值,不应该考虑这些行)
  • 请花 5 分钟时间阅读此页面stackoverflow.com/help/formatting。并提高您问题的可读性。
  • "----" 应该(可能)为 NULL
  • 是的,这是正确的----应该是NULL
  • 为什么 id 42 和 dependency_3 在结果中?不应该是“-------”吗?

标签: php mysql date max


【解决方案1】:

据我了解,您希望对每个 project_id 提出问题

  • 最新的不为空的 cmets 项
  • 不为空的最新 next_steps 项
  • 不为空的最新依赖项

这些项目可以来自不同的行。如果是这种情况,您可以使用以下查询:

SELECT
    project_id,
    (SELECT e2.comments FROM example8 e2 WHERE e2.date = (
        SELECT MAX(date) FROM example8 e1 
        WHERE e1.comments IS NOT NULL and e2.project_id = e1.project_id
        GROUP BY e1.project_id )
     AND e.project_id = e2.project_id) as comments,
    (SELECT e2.next_steps FROM example8 e2 WHERE e2.date = (
        SELECT MAX(date) FROM example8 e1 
        WHERE e1.next_steps IS NOT NULL and e2.project_id = e1.project_id
        GROUP BY e1.project_id )
     AND e.project_id = e2.project_id) as next_steps,
    (SELECT e2.dependencies FROM example8 e2 WHERE e2.date = (
        SELECT MAX(date) FROM example8 e1 
        WHERE e1.dependencies IS NOT NULL and e2.project_id = e1.project_id
        GROUP BY e1.project_id )
     AND e.project_id = e2.project_id) as dependencies
FROM     example8 e
GROUP BY e.project_id;

Demo: Solutions of Strawberry and mine

【讨论】:

  • 耶——我的更快! :-)
  • @me_sleepin 我不得不说草莓的第二种解决方案是最好的。所以你接受他的回答才是公平的。请这样做。
【解决方案2】:

我怀疑这是非常复杂的 - 但我似乎有一个高级的时刻,所以......

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table
 (id_clocking INT NOT NULL AUTO_INCREMENT PRIMARY KEY
 ,project_id INT NOT NULL
 ,date        DATE NOT NULL
 ,comments        VARCHAR(20) NULL
 ,next_steps VARCHAR(20) NULL
 ,dependencies VARCHAR(20) NULL
 );

 INSERT INTO my_table VALUES
 (1,39,'2014-08-01','new_com','step1','dependency1'),
 (2,39,'2014-08-10',NULL,'step2',NULL),
 (3,39,'2014-08-12',NULL,'step3','dependencyx'),
 (4,39,'2014-08-05','commentx','stepx','depend'),
 (5,42,'2014-07-15',NULL,NULL,'dependency_3'),
 (6,42,'2014-07-03','comment_3','step_c','dependency_4'),
 (7,42,'2014-08-01',NULL,'step_d',NULL);

 SELECT i.project_id
      , j.comments
      , k.next_steps
      , l.dependencies
   FROM 
      ( SELECT project_id
             , MAX(CASE WHEN type = 'comment' THEN max_date END) comment_date
             , MAX(CASE WHEN type = 'next_steps' THEN max_date END) next_steps_date
             , MAX(CASE WHEN type = 'dependencies' THEN max_date END) dependencies_date
          FROM 
             ( SELECT a.project_id
                    , a.type
                    , MAX(a.date) max_date
                 FROM 
                    ( SELECT project_id
                           , date
                           , 'comment' type
                           , comments FROM my_table 
                       WHERE comments IS NOT NULL
                       UNION
                      SELECT project_id
                           , date
                           , 'next_steps' 
                           , next_steps 
                        FROM my_table 
                       WHERE next_steps IS NOT NULL
                       UNION
                      SELECT project_id
                           , date
                           , 'dependencies' 
                           , dependencies 
                        FROM my_table 
                       WHERE dependencies IS NOT NULL
                    ) a
                GROUP
                   BY project_id
                    , type
             ) m
         GROUP
            BY project_id
      ) i
   JOIN my_table j
     ON j.project_id = i.project_id 
    AND j.date = i.comment_date
   JOIN my_table k
     ON k.project_id = i.project_id 
    AND k.date = i.next_steps_date
   JOIN my_table l
     ON l.project_id = i.project_id 
    AND l.date = i.dependencies_date;

 +------------+-----------+------------+--------------+
 | project_id | comments  | next_steps | dependencies |
 +------------+-----------+------------+--------------+
 |         39 | commentx  | step3      | dependencyx  |
 |         42 | comment_3 | step_d     | dependency_3 |
 +------------+-----------+------------+--------------+

这似乎是一个更简单的解决方案...(也更快:http://sqlfiddle.com/#!2/b9552e/5

SELECT x.project_id
     , c.comments
     , n.next_steps
     , d.dependencies
  FROM 
     ( SELECT project_id
            , MAX(CASE WHEN comments IS NOT NULL THEN date END) comments_date
            , MAX(CASE WHEN next_steps IS NOT NULL THEN date END) next_steps_date
            , MAX(CASE WHEN dependencies IS NOT NULL THEN date END) dependencies_date 
         FROM my_table 
        GROUP 
           BY project_id
     ) x
  JOIN my_table c
    ON c.project_id = x.project_id
   AND c.date = x.comments_date
  JOIN my_table n
    ON n.project_id = x.project_id
   AND n.date = x.next_steps_date
  JOIN my_table d
    ON d.project_id = x.project_id
   AND d.date = x.dependencies_date
 WHERE c.comments IS NOT NULL
   AND n.next_steps IS NOT NULL
   AND d.dependencies IS NOT NULL;

   +------------+-----------+------------+--------------+
   | project_id | comments  | next_steps | dependencies |
   +------------+-----------+------------+--------------+
   |         39 | commentx  | step3      | dependencyx  |
   |         42 | comment_3 | step_d     | dependency_3 |
   +------------+-----------+------------+--------------+

【讨论】:

  • 看起来比我的解决方案更复杂,但两者都在工作fiddle。我将my_table 重命名为example8。为您的工作 +1
  • 新的执行计划看起来最好,请参阅newest Fiddle。我添加了一个带有连接的解决方案,但结果并没有给我留下深刻印象。
【解决方案3】:

要获得结果,请运行以下查询:
SELECT * FROM tableName AS a WHERE date = ( SELECT MAX(date) FROM tableName AS b )

【讨论】:

    【解决方案4】:

    下面显示的查询应该可以工作:

    Select 
        tableA.project_id, comments, next_steps, dependencies
    from
        tableA,
        (select 
            max(date) date, project_id
        from
            tableA
        group by project_id) tableB
    WHERE
        tableA.date = tableB.date
            AND tableA.project_id = tableB.project_id;
    

    请根据需要更改列名和表名。

    【讨论】:

    • 同样,对于不同问题的一个很好的解决方案......虽然我们中的一些人试图阻止'隐式'(逗号)连接语法。
    猜你喜欢
    • 2011-12-11
    • 2010-10-11
    • 2013-04-02
    • 2012-08-26
    • 2020-05-06
    • 2013-07-26
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多