2009-05-05 62 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; 
相关问题