GROUP BY having MAX date

后端 未结 4 988
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-04 19:01

I have problem when executing this code:

SELECT * FROM tblpm n 
WHERE date_updated=(SELECT MAX(date_updated) 
FROM tblpm GROUP BY control_number 
HAVING cont         


        
相关标签:
4条回答
  • 2020-12-04 19:21

    There's no need to group in that subquery... a where clause would suffice:

    SELECT * FROM tblpm n
    WHERE date_updated=(SELECT MAX(date_updated)
        FROM tblpm WHERE control_number=n.control_number)
    

    Also, do you have an index on the 'date_updated' column? That would certainly help.

    0 讨论(0)
  • 2020-12-04 19:34

    Fast and easy with HAVING:

    SELECT * FROM tblpm n 
    FROM tblpm GROUP BY control_number 
    HAVING date_updated=MAX(date_updated);
    

    In the context of HAVING, MAX finds the max of each group. Only the latest entry in each group will satisfy date_updated=max(date_updated). If there's a tie for latest within a group, both will pass the HAVING filter, but GROUP BY means that only one will appear in the returned table.

    0 讨论(0)
  • 2020-12-04 19:43

    Putting the subquery in the WHERE clause and restricting it to n.control_number means it runs the subquery many times. This is called a correlated subquery, and it's often a performance killer.

    It's better to run the subquery once, in the FROM clause, to get the max date per control number.

    SELECT n.* 
    FROM tblpm n 
    INNER JOIN (
      SELECT control_number, MAX(date_updated) AS date_updated
      FROM tblpm GROUP BY control_number
    ) AS max USING (control_number, date_updated);
    
    0 讨论(0)
  • 2020-12-04 19:43

    Another way that doesn't use group by:

    SELECT * FROM tblpm n 
      WHERE date_updated=(SELECT date_updated FROM tblpm n 
                            ORDER BY date_updated desc LIMIT 1)
    
    0 讨论(0)
提交回复
热议问题