76

Toys と Games の 2 つのテーブルがあります。

+--------------------+------------------+
| 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 が関わっているおもちゃとゲームの合計数を取得するクエリが必要です。

基本的に、次の 2 つのクエリの合計が必要です。

SELECT COUNT(*) FROM Toys WHERE little_kid_id = 900;
ゲーム WHERE little_kid1 = 900 から COUNT(*) を選択
                              または little_kid2 = 900
                              または little_kid3 = 900;

これを単一の SQL クエリで取得することは可能ですか? 明らかに、プログラムでそれらを合計できますが、それはあまり望ましくありません。

(不自然な例ではスキーマが非効率に見えることに気づきました。スキーマを変更できないと仮定しましょう。)

4

8 に答える 8

166

それらをまとめて、サブクエリを使用します。

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

出来上がり!

于 2009-05-05T18:50:30.517 に答える
7
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
)
于 2009-05-05T18:52:05.677 に答える
5

このクエリが実行される頻度とデータの変更頻度に応じて、次のように定期的にデータを集計テーブルに入れることができます。

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

パフォーマンスに関しては、非常に高速で、厄介なサブクエリを回避できます。

于 2009-05-05T23:06:53.317 に答える
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
于 2012-11-08T09:33:55.290 に答える