2011-08-26 132 views
1

反正是有优化以下查询:MySQL的相关子查询SUM()ORDER BY

SELECT 
    t1.id, 
    (SELECT SUM(col1) FROM table_name_two t2 WHERE t2.name LIKE CONCAT('%',t1.name)) AS col1_count 
FROM 
    table_name_one t1 
ORDER BY 
    col1_count DESC 

使用ORDER BY col1_count DESC需要很长的时间。

谢谢。

+1

子查询非常缓慢,我不会推荐他们。你可以加入这些表吗? –

+0

你的通配符匹配会杀死你。字符串前面的通配符无法使用任何索引,因此它将进行表扫描以查找每一个匹配项。除非您重新设计数据以将字符串的匹配部分放在前面,否则无法修复它。 – dkretz

+1

@BookOfZeus:“SubQueries非常慢”---我永远不会这样说。有些情况下子查询比联接更好。 – zerkms

回答

2

只是要与加入的on子句中你比较正常的加入:

SELECT 
    t1.id, 
    SUM(t2.col1) AS col1_count 
FROM table_name_one t1 
LEFT JOIN table_name_two t2 on t2.name LIKE CONCAT('%', t1.name) 
GROUP BY 1 
ORDER BY 2 DESC 

应该方式更快这种方式 - 它基本上是一个查询,而不是“n”的查询,但它赢得了” t使用LIKE运营商使用LIKE运营商获得任何帮助%