Sort data (order by) before group by in mysql

非 Y 不嫁゛ 提交于 2019-12-02 02:18:51

问题


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.

select * FROM prd_data group by sub_prd_id order by created_at desc

But this query not returned what i need. for example, according to below data, after query executes, result should be as below,

id  name    sub_prd_id  created_at
4   Grape     10            2013-04-28 03:11:55
6   Banana    11            2013-04-28 03:23:14
7   Pineapple 12            2013-04-28 03:23:44

Here is Table Structure with data.

id  name    sub_prd_id  created_at
2   Apple     10            2013-04-28 03:04:51
3   Orange    10            2013-04-28 03:08:19
4   Grape     10            2013-04-28 03:11:55
5   Mango     11            2013-04-28 03:22:48
6   Banana    11            2013-04-28 03:23:14
7   Pineapple 12            2013-04-28 03:23:44

回答1:


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.




回答2:


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.




回答3:


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;



回答4:


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 |


来源:https://stackoverflow.com/questions/16261068/sort-data-order-by-before-group-by-in-mysql

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!