2011-09-07 55 views
0

我有一个表“事件”和几个关节表计数项目如下:MySQL的:在许多连接表

活动 +标签 +图像 +视频

我想能够形成一个查询,在那里我可以计算联合表中的项目,如果有的话。所以我有这样的:

SELECT t.*, COUNT(distinct t1.id) visible_tags, COUNT(distinct t2.id) 
     invisible_tags, ..., COUNT(distince tn.id) approved_videos 
FROM events t 
LEFT JOIN tags t1 ON ... 
LEFT JOIN tags t2 ON ... 
LEFT JOIN tags t3 ON ... 
... 
LEFT JOIN videos tn ON ... 

问题是,查询即使所有的索引需要相当长的时间。有没有办法如何形成它不同?

谢谢。

回答

1

除了@sanmai关于'说明选择'的说明,您还可以加入子查询。

SELECT t.*, t1_count, t2_count 
FROM events t 
LEFT JOIN (select count(distinct id) as t1_count from tags) as t1 
LEFT JOIN (select count(distinct id) as t2_count from tags) as t2 
... 
1

如果查询需要很长时间的机会,问题不在查询中。

此查询使用了哪些索引?请展示使用EXPLAIN SELECT ...