web-dev-qa-db-ja.com

2つの異なるテーブルに2つのcount(*)結果を一緒に追加するにはどうすればよいですか?

おもちゃとゲームの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(*)おもちゃWHERE little_kid_id = 900; 
 SELECT COUNT(*)ゲームからWHERE WHERE_kid1 = 900 
 OR little_kid2 = 900 
 OR little_kid3 = 900; 

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

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

52
Runcible

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

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

出来上がり!

113
Eric
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
)
5
Adam Robinson
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;

DUALテーブルから選択

5
anish

これを試してください...

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
4
Scott Ramey

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

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

賢明なパフォーマンスであり、厄介なサブクエリを回避します。

4
James C
  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
Hitesh Makwana
select t1.tx,t2.px,t3.mx,t2.px + t3.mx  
        as total from(
SELECT COUNT (DISTINCT id) as tx
FROM Customer) as t1
cross join(
select COUNT (DISTINCT name) as px
FROM details 
) as t2
cross join(
select count (distinct device_id) as mx
from detailconfig 
) as t3
0
Arul