2013-08-18 82 views
0

你好,我添加了GROUP_CONCAT函数到我的查询和该函数杀死了我的查询:/。 我的查询是:GROUP_CONCAT太慢

SELECT u.username,a.user_id,a.id,a.text,a.lang as fromLang,b.lang as toLang,GROUP_CONCAT(DISTINCT b.id) AS translation_ids FROM sentence as a 
    INNER JOIN sentence_relationship as sr ON 
    (sr.sentence_id = a.id) 
    INNER JOIN sentence as b ON 
    (b.id = sr.translation_id AND a.id = sr.sentence_id) 
    INNER JOIN users as u ON 
    (u.id = a.user_id) GROUP BY a.id LIMIT 10; 

该查询有什么问题?

+0

您总是可以将ID作为单独的查询来获取。 – mpen

+0

是的,我可以,但我想在一个查询中做所有事情。 –

回答

0

这是您的查询(有点格式化):

SELECT u.username, a.user_id, a.id,a.text,a.lang as fromLang, b.lang as toLang, 
     GROUP_CONCAT(DISTINCT b.id) AS translation_ids 
FROM sentence a INNER JOIN 
    sentence_relationship sr 
    ON sr.sentence_id = a.id INNER JOIN 
    sentence b 
    ON b.id = sr.translation_id AND a.id = sr.sentence_id INNER JOIN 
    users as u 
    ON u.id = a.user_id 
GROUP BY a.id 
LIMIT 10; 

它是从你的问题的group_concat()是否与group by加入不清楚。这可能会减慢速度。

limit 10正在匹配的第一个10 a.idgroup by做了一个隐式排序)。如果使用子查询执行此操作,它可能会加快查询速度:

SELECT u.username, a.user_id, a.id,a.text,a.lang as fromLang, b.lang as toLang, 
     GROUP_CONCAT(DISTINCT b.id) AS translation_ids 
FROM (select s.* 
     from sentence s 
     order by a.id 
     limit 10 
    ) a INNER JOIN 
    sentence_relationship sr 
    ON sr.sentence_id = a.id INNER JOIN 
    sentence b 
    ON b.id = sr.translation_id AND a.id = sr.sentence_id INNER JOIN 
    users as u 
    ON u.id = a.user_id 
GROUP BY a.id; 

这假设所有连接都起作用并匹配记录。如果连接用于过滤,则可能会返回少于10行。

+0

感谢您的回答。这对我帮助很大。 –

+0

我试图用该查询创建一个视图,但视图不接受FROM子句中的子查询。我想要一个与旧的查询具有相同性能的查询。我该怎么办? –

+0

@HalilBİLGİN。 。 。我能想到在MySQL中这样做的唯一方法是使用两个视图。一个用于子查询,一个用于外部查询。 –