Sort data (order by) before group by in mysql

后端 未结 4 1889
说谎
说谎 2021-01-22 08:54

I want to group below data from sub_prd_id. but before that i need order data from max created_at.

I wrote query as below.

相关标签:
4条回答
  • 2021-01-22 09:07

    What you're trying to accomplish is known as a groupwise maximum, which can't be achieved using ORDER BY. Instead, one must find the MAX() and then join the result back to the table:

    SELECT prd_data.* FROM prd_data NATURAL JOIN (
      SELECT   sub_prd_id, MAX(created_at) created_at
      FROM     prd_data
      GROUP BY sub_prd_id
    ) t
    

    See it on sqlfiddle.

    0 讨论(0)
  • 2021-01-22 09:17

    Your hunch was correct. This will so it:

    select * from
      (select * from prd_data order by created_at desc) x
    group by sub_prd_id
    

    Note that this is a mysql only solution, but since the question was tagged mysql that should be OK. Mysql has special functionality regarding group by when only some of the non-aggregated columns are grouped-by: whereas all other databases disallow this, mysql returns the first row encountered for each unique group by combination. By sorting before grouping, you get the rows with the latest created_at value for each sub_prd_id.

    0 讨论(0)
  • 2021-01-22 09:21
    SELECT x.* 
      FROM prd_data x 
      JOIN 
         ( SELECT sub_prd_id
                , MAX(created_at) max_created_at 
             FROM prd_data 
            GROUP 
               BY sub_prd_id
         ) y 
        ON y.sub_prd_id = x.sub_prd_id 
       AND y.max_created_at = x.created_at;
    
    0 讨论(0)
  • 2021-01-22 09:33

    Query (will always work but is slower than other query):

    SQLFIDDLEExample

    SELECT t1.*
    FROM prd_data t1
    WHERE t1.id = (SELECT t2.id
                   FROM prd_data t2
                   WHERE t2.sub_prd_id= t1.sub_prd_id
                   ORDER BY t2.created_at DESC
                   LIMIT 1)
    

    Other Query (will work only if sub_prd_id has one MAX value):

    SELECT t1.*
    FROM prd_data t1
    WHERE t1.created_at = (SELECT MAX(t2.created_at)
                           FROM prd_data t2
                           WHERE t2.sub_prd_id= t1.sub_prd_id)
    

    Result:

    | ID |      NAME | SUB_PRD_ID |                   CREATED_AT |
    --------------------------------------------------------------
    |  4 |     Grape |         10 | April, 28 2013 03:11:55+0000 |
    |  6 |    Banana |         11 | April, 28 2013 03:23:14+0000 |
    |  7 | Pineapple |         12 | April, 28 2013 03:23:44+0000 |
    
    0 讨论(0)
提交回复
热议问题