如何在mysql非常大的表中制作更快的组?

时间:2014-12-24 10:42:35

标签: mysql sql select group-by greatest-n-per-group

我在MySQL中有表格,比如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

我想要only one the youngest Troll from every famillies

所以我想得到这样的行:

troll.troll_name
-----------------    
Bartek
Andrzej

我在数据库中有数百万的巨魔,我尝试过这样的查询:

SELECT troll.troll_name 
FROM troll 
GROUP BY troll.troll_family_id 
ORDER BY troll.troll_birth_timestamp DESC
LIMIT 0, 50

但它冻结了我对http的回应。所以我甚至不知道,这个查询是否正确。

3 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:0)

轻微更改现有查询。 ORDER BY在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

更多添加索引到tf.troll_family_id,t.troll_family_id

答案 2 :(得分:0)

您可以在群组

上使用MAX功能
SELECT troll.troll_name, MAX(troll_birth_timestamp) AS troll_birth_timestamp
FROM troll 
GROUP BY troll.troll_family_id 
LIMIT 0, 50