2013-11-25 44 views
1

我有小部件的表格看起来像:SQL查询来查找连接表行作为总结的计数每行

id (integer) 
referrer (varchar(255)) 
width (integer) 
height (integer) 

...和其他一些人。

我也有事件看起来像一个表:

id (integer) 
widgetid (integer) 
eventtype (string) 
created_at (datetime) 

...和其他一些人。

我在寻找一个数据样本表,它为每个窗口小部件找到关于它自己和某些事件类型的相关事件的详细信息(一次针对事件类型A,B和C,一次针对事件类型A只要)。

我需要使用非特定厂商(即ANSI SQL)对于这一点,就需要在PostgreSQL的工作既以及MySQL的

我想一些类似于此,但它是非常缓慢:

SELECT w.id, w.referrer, w.width, w.height, COUNT(e.widgetid), COUNT(f.widgetid) 
FROM widgets w 
JOIN events e on (e.widgetid = w.id AND e.eventtype = 'A') 
JOIN events f on (f.widgetid = w.id AND f.eventtype IN ('A','B','C')) 
GROUP BY w.id; 

,但它是令人难以置信的慢(自然)。 在e.widgetid,e.eventtype和w.id上有索引。

我在构建这个权利,我该如何加快速度(尽管在widgetid上编制索引)?

我想过要做子查询,但不知道每行的小部件ID(是否有一个函数?)我还没有很远。

我也不完全确定哪个JOIN我应该使用。我想(但纠正我,如果我错了)左或内联合适合这一点。

干杯

+0

是MySQL还是PostgreSQL,请删除其中的一个 – nrathaus

+0

它需要在MySQL和PostgreSQL上工作。 –

+1

既然你正在使用JOIN,你能告诉我们你有什么索引(如果有的话)? – nrathaus

回答

1

您的加入是缓慢的,因为你没有索引,或者您有索引,但不是因为你是用加入的值。

为id,widgetid和eventtype添加一个索引,我向你保证它会显着提高速度。

+0

原来在widgetid和eventtype上已经有了索引 - 但这并没有加快速度 - 我怀疑在使用的特定SQL有什么问题... –

+1

请显示您的查询的'EXPLAIN' – nrathaus