2012-09-21 60 views
2

,我有以下结构的脚本:MySQL的嵌套SELECT太慢

SELECT SUM(CASE WHEN pf.info IS NOT NULL THEN 1 ELSE 0 END) 
FROM summary s 
LEFT JOIN (SELECT id, info FROM items GROUP BY id) pf ON s.id=pf.id 
GROUP BY s.date 

我想是计算那些ID的这是在“摘要”,并出现在“项目”。 'items'有相同的id重复多次,这就是为什么我做GROUP BY。

这个脚本按我的意思工作,但速度非常慢,比直接执行LEFT JOIN(以及多次计数每个ID)要慢得多。这似乎没有意义,因为我需要一个更小的子空间,它应该更容易。

所以问题是:如何重构查询,使其更快?

+0

'SELECT id,info FROM items GROUP BY id' ---这个查询选择了什么'info'?如果某个特定的'id'有几个信息呢? – zerkms

回答

3

使用count(distinct ...)

SELECT count(distinct s.id) 
FROM summary s 
JOIN items i ON s.id = i.id 


我不明白为什么你被s.date分组 - 有在,为什么,所以如果它不是一个错误,你的问题不知道你的需要组date,使用这个:

SELECT s.date, count(distinct s.id) 
FROM summary s 
JOIN items i ON s.id = i.id 
GROUP BY s.date 
+0

此查询不完全相同。在原始查询中,结果集中可能有几行具有相同的's.id' – zerkms

+0

@zerkms,那么它不是“id”。我敢打赌,这是一个关键。 – Bohemian

+0

好,点了。 +1 – zerkms