如何在两个不同的表上一起添加两个count(*)结果?

Run*_*ble 53 mysql sum count

我有两张桌子:玩具和游戏.

+--------------------+------------------+
| 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 |
+--------------------+------------------+
Run Code Online (Sandbox Code Playgroud)

一个小孩可以有多个玩具.一个小孩可以同时参加多个游戏.

我想要一个查询,它会给我一个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查询中获取此信息?显然,我可以通过编程方式对它们求和,但这不太可取.

(我意识到这个人为的例子使得模式看起来很无效.让我们假设我们不能改变模式.)

Eri*_*ric 119

将它们包装起来并使用子查询:

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
Run Code Online (Sandbox Code Playgroud)

瞧!


Ada*_*son 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
)
Run Code Online (Sandbox Code Playgroud)

  • 一些解释将有助于更好地理解。 (2认同)

Jam*_*s C 5

根据此查询可能会运行多少以及数据更改的频率,可以定期将数据放入聚合表中,如下所示:

CREATE TABLE aggregated (
    little_kid_id INT UNSIGNED,
    games_count INT UNSIGNED,
    toys_count INT UNSIGNED,
    PRIMARY KEY (little_kid_id)
);
Run Code Online (Sandbox Code Playgroud)

性能明智的做法是很快,并且避免任何讨厌的子查询。


小智 5

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;
Run Code Online (Sandbox Code Playgroud)

从DUAL表中选择

  • 请对您的答案进行描述。 (2认同)