2012-11-07 19 views
1

匹配的記錄考慮以下4個表MySQL的次數從多個表

entity table1  table2  table3  
------ ------------- ------------- ------------- 
id  ei(entity.id) ei(entity.id) ei(entity.id) 
name something  somethingelse yetanother 

我怎樣才能找出所有三個表在實體的用法,這樣表示

--------------------- 
| id | t1 | t2 | t3 | 
--------------------- 
| 1 | 14 | 23 | 0 | 
| 2 | 66 | 9 | 5 | 
... 

我原來的方法是從實體選擇然後離開加入其他表,但MySQL似乎並不喜歡它

SELECT e.id,count(t1.id) FROM entity AS e LEFT JOIN table1 AS t1 on e.id=t1.ei; 

編輯:下面是輸出1個表

mysql> explain select e.id,count(o.id) from entity e left join table1 t1 on e.id=o.ei where e.ty=3; 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
| 1 | SIMPLE  | e  | ALL | NULL   | NULL | NULL | NULL | 1083 | Using where | 
| 1 | SIMPLE  | o  | ALL | NULL   | NULL | NULL | NULL | 90201 |    | 
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+ 
2 rows in set (0.04 sec)

相反的效果要好得多,但不能擴展到多個表

SELECT e.id,count(t1,id) FROM table1 AS t1 LEFT JOIN entity AS e ON t1.ei=e.id 

回答

1

重寫此查詢的另一種方法。

集團並計算每個單獨的表,然後再加入:

SELECT a.id, 
     COALESCE(b.t1, 0) AS t1, 
     COALESCE(c.t2, 0) AS t2, 
     COALESCE(d.t3, 0) AS t3 
FROM 
     entity a 
    LEFT JOIN 
     (SELECT ei, 
       COUNT(*) AS t1 
      FROM table1 
      GROUP BY ei 
     ) AS b 
      ON a.id = b.ei 
    LEFT JOIN 
     (SELECT ei, 
       COUNT(*) AS t2 
      FROM table2 
      GROUP BY ei 
     ) AS c 
      ON a.id = c.ei 
    LEFT JOIN 
     (SELECT ei, 
       COUNT(*) AS t3 
      FROM table3 
      GROUP BY ei 
     ) AS d 
      ON a.id = d.ei 
    ; 

您應該(ei)在每個3代表的絕對增加一個索引,如果你還沒有一個。

+0

哇。工程奇蹟。您可能希望在每個FROM – MonoThreaded

+0

之前修復額外的','順便說一下,如果沒有索引,查詢需要0.5s,這對我來說非常合適。 – MonoThreaded

+0

如果你喜歡0.5超過0.005,對我來說沒問題。我不明白爲什麼人們不想把索引放在表格中,這就是他們的目的,以提高效率。 –

1
SELECT a.ID, 
     COUNT(b.ei) t1, 
     COUNT(c.ei) t2, 
     COUNT(d.ei) t3 
FROM entity a 
     LEFT JOIN table1 b 
      ON a.id = b.ei 
     LEFT JOIN table2 c 
      ON a.id = c.ei 
     LEFT JOIN table3 d 
      ON a.ID = d.ei 
GROUP BY a.ID 
+0

我試過了,在一分鐘左右之後不得不殺掉查詢,而單獨運行計數需要0.04s ...我預計它會花費0.12s(?) – MonoThreaded

+0

您是否對此列有索引? 'entity.id','table1.ei','table2.ei','table3.ei'?你可以發佈結果'EXPLAIN pasteyourQueyrHere'? –

+0

用解釋輸出 – MonoThreaded

1
select select 
e.id, 
sum(case when t1.name is null then 0 else 1 end) t1, 
sum(case when t2.name is null then 0 else 1 end) t2, 
sum(case when t3.name is null then 0 else 1 end) t3 
from 
entity e left join table1 t1 on e.id=t1.ei left join table2 t2 on e.id=t2.ei left join table3 t3 on e.id=t3.ei 
group by e.id 

==

SQL Fiddle Demo

+0

這也產生了一個很長的查詢(如在幾分鐘內) – MonoThreaded