2009-05-05 66 views
37

我有兩個表:玩具和遊戲。如何在兩個不同的表上添加兩個計數(*)結果?

+--------------------+------------------+ 
| Field    | Type    | 
+--------------------+------------------+ 
| toy_id    | int(10) unsigned | 
| little_kid_id  | int(10) unsigned | 
+--------------------+------------------+ 

+--------------------+------------------+ 
| Field    | Type    | 
+--------------------+------------------+ 
| game_id   | int(10) unsigned | 
| little_kid1  | int(10) unsigned | 
| little_kid2  | int(10) unsigned | 
| little_kid3  | int(10) unsigned | 
+--------------------+------------------+ 

小孩子可以有多個玩具。 一個小孩可以一次參加多個遊戲。

我想要一個查詢,它會給我一個little_kid參與的玩具+遊戲總數。

基本上,我想這兩個查詢的總和:

 
SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900; 
SELECT COUNT(*) from Games WHERE little_kid1 = 900 
           OR little_kid2 = 900 
           OR little_kid3 = 900; 

是否有可能得到這個在一個SQL查詢?顯然,我可以通過編程來總結它們,但這不太理想。

(我意識到人爲的例子,使架構看ineffecient讓我們假設我們不能改變的模式。)

回答

86

總結他們和使用子查詢:

SELECT 
(SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900)+ 
(SELECT COUNT(*) from Games WHERE little_kid1 = 900 
           OR little_kid2 = 900 
           OR little_kid3 = 900) 
AS SumCount 

瞧!

+0

乾杯!我知道它必須是那樣的簡單。 – Runcible 2009-05-05 18:53:27

+0

我們怎樣才能得到它沒有子查詢 – 2016-11-08 11:18:02

5
SELECT COUNT(1) FROM 
(
    SELECT 1 FROM Toys WHERE little_kid_id = 900 
    UNION 
    SELECT 1 FROM Games WHERE little_kid1 = 900 
         OR little_kid2 = 900 
         OR little_kid3 = 900 
) 
4

根據這個查詢多少可能要運行和數據的頻率變化,你可以定期把數據放到一個彙總表如下:

CREATE TABLE aggregated (
    little_kid_id INT UNSIGNED, 
    games_count INT UNSIGNED, 
    toys_count INT UNSIGNED, 
    PRIMARY KEY (little_kid_id) 
); 

明智的性能,這將是S * *快速熱,並避免任何討厭的子查詢。

3

試試這個...

db: mysql 

SELECT SUM(dum.tab) AS total FROM (
SELECT COUNT(b.category_id) AS tab FROM tblcategory AS b WHERE b.category_id=1 
UNION ALL 
SELECT COUNT(a.category_id) AS tab FROM tblcategory AS a WHERE a.category_id=2 
) AS dum 
0
SELECT M.*,M.TOYSCOUNT+M.GAMECOUNT 
FROM (
    (SELECT COUNT(*) FROM Toys WHERE little_kid_id) AS TOYSCOUNT, 
    (SELECT COUNT(*) from Games WHERE little_kid1 = 900 OR little_kid2 = 900 OR little_kid3 = 900) AS GAMECOUNT 
    ) M 
0
SELECT 
((SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900)+ 
(SELECT COUNT(*) from Games WHERE little_kid1 = 900 
           OR little_kid2 = 900 
           OR little_kid3 = 900)) 
AS Sum FROM DUAL; 
相關問題