我有两张桌子:玩具和游戏.
+--------------------+------------------+
| 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)
瞧!
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)
根据此查询可能会运行多少以及数据更改的频率,可以定期将数据放入聚合表中,如下所示:
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)