Reputation: 691
I have got tables in MySQL like thoose:
troll_id troll_family_id troll_name troll_birth_timestamp
--------------------------------------------------------------------
1 1 Kamil 100000
2 1 Bartek 200000
3 2 Maciek 100000
4 2 Andrzej 200000
troll_family_id troll_family_name
------------------------------------------
1 Trollowski
2 Trollowicz
I want get only one the youngest Troll from every famillies
so I want to get rows like that:
troll.troll_name
-----------------
Bartek
Andrzej
I have got few millions of trolls in DB, I tried query like that:
SELECT troll.troll_name
FROM troll
GROUP BY troll.troll_family_id
ORDER BY troll.troll_birth_timestamp DESC
LIMIT 0, 50
But it freezes my response for http. So I do not even know, is this query correct.
Upvotes: 3
Views: 1188
Reputation: 9658
You can use MAX
function on groups
SELECT troll.troll_name, MAX(troll_birth_timestamp) AS troll_birth_timestamp
FROM troll
GROUP BY troll.troll_family_id
LIMIT 0, 50
Upvotes: 0
Reputation: 1180
Slight Changes to your existing query. ORDER BY works after GROUP BY:
SELECT troll_family_name, t.troll_name
FROM
(
SELECT troll_family_name, t.troll_name
FROM troll t
JOIN troll_family tf ON tf.troll_family_id=t.troll_family_id
ORDER BY t.troll_birth_timestamp DESC
)temp
GROUP BY troll_family_name
LIMIT 0, 50
More over add indexes to tf.troll_family_id, t.troll_family_id
Upvotes: 0
Reputation: 29051
Try this:
SELECT a.troll_name
FROM troll a
INNER JOIN (SELECT troll_family_id, MAX(troll_birth_timestamp) AS troll_birth_timestamp
FROM troll
GROUP BY troll_family_id
) AS b on a.troll_family_id = b.troll_family_id AND a.troll_birth_timestamp = b.troll_birth_timestamp
LIMIT 0, 50
Upvotes: 3