Reputation: 15702
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
Upvotes: 2
Views: 4014
Reputation: 9724
Query (will always work but is slower than other query):
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 |
Upvotes: 0
Reputation: 33935
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;
Upvotes: 1
Reputation: 424983
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.
Upvotes: 2
Reputation: 125835
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.
Upvotes: 6