2013-01-25 145 views
1

MySQL;從3表同時獲取信息

這裏是我的小問題。 我有三個表: a_names_1 b_names_2 c_names_3 它們結構相同。他們都有兩個項目:名稱和使用

是否有任何QUERY運行得到並計算所有這三個表中所有'使用'= 1的'名稱'在一起。

我已經試過這一個,但沒有奏效:

(SELECT COUNT(*) 'name' from a_names_1) UNION 
(SELECT COUNT(*) 'name' from a_names_2) UNION 
(SELECT COUNT(*) 'name' from a_names_3) WHERE `used`=1 

我使用phpMyAdmin爲MySQL。

任何幫助,將不勝感激..在此先感謝

回答

1

此查詢如果您需要總結全部用於每個名稱輸出的不同names從所有表計與used=1

select count(distinct name) 
from 
(
select name,used from a_names_1 where used=1 
union all 
select name,used from a_names_2 where used=1 
union all 
select name,used from a_names_3 where used=1 
) t 

從所有表格中輸出並且只用SUM = 1表示然後:

select count(*) from 
(
select name, SUM(used) 
from 
(
select name,used from a_names_1 
union all 
select name,used from a_names_2 
union all 
select name,used from a_names_3 
) t 
GROUP BY name 
HAVING SUM(used)=1 
) t1 
0
select count(*) as name 
from 
(
select name, used from a_names_1 
union 
select name, used from a_names_2 
union 
select name, used from a_names_3) t 
where t.used = 1 
+1

WHERE不想在子查詢中,否則沒有'used'列可用來檢查? –

+0

好點,更正 – WKordos

+0

好吧,在三個表中有超過1,800萬項,它滯後於服務器。當帶有表的查詢只需要0.004秒來給出結果時。 可以花費那麼多時間嗎? –

0

可能這很慢,因爲你失去了索引優化。我會做的是做好三個查詢,像

SELECT SUM('name') AS name_sum 
FROM ((SELECT COUNT(*) 'name' from a_names_1 WHERE `used`=1) 
    UNION (SELECT COUNT(*) 'name' from a_names_2 WHERE `used`=1)); 

如果這不起作用,它可能是有名字的使用問題

+0

#1248 - 每個派生表都必須有自己的別名 它給了我這個錯誤 –

0

也許你想是這樣的:

select count(*) as cnt 
from 
(
    select name from a_names_1 t1 where t1.used = 1 
    union 
    select name from a_names_2 t2 where t2.used = 1 
    union 
    select name from a_names_3 t3 where t3.used = 1 
) t 
0

直截了當的解決方案;

SELECT SUM(used) FROM (
    SELECT used FROM a_names_1 WHERE used=1 
    UNION ALL 
    SELECT used FROM a_names_2 WHERE used=1 
    UNION ALL 
    SELECT used FROM a_names_3 WHERE used=1 
) a 

SQLfiddle for testing

一種替代,如果你有used索引(以及所使用的唯一的值是0或1)是隻是做使用索引的計數;

SELECT SUM(used) total FROM (
    SELECT SUM(used) used FROM a_names_1 
    UNION ALL 
    SELECT SUM(used) FROM a_names_2 
    UNION ALL 
    SELECT SUM(used) FROM a_names_3 
) a 

SQLfiddle for this example

如果您查看後一個查詢的查詢計劃,可以看到它有效地使用索引。