2009-05-05 10 views
37

J'ai deux tables: jouets et jeux.Comment ajouter deux résultats de comptage (*) ensemble sur deux tables différentes?

+--------------------+------------------+ 
| 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 | 
+--------------------+------------------+ 

Un petit enfant peut avoir plusieurs jouets. Un petit enfant peut participer à plusieurs jeux à la fois.

Je veux une requête qui me donnera le nombre total de jouets + jeux auxquels un little_kid est impliqué.

Fondamentalement, je veux la somme de ces deux requêtes:

 
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; 

Est-il possible d'obtenir ce dans une seule requête SQL? Évidemment, je peux les résumer par programme, mais c'est moins souhaitable.

(je me rends compte que l'exemple fabriquée rend le look de schéma ineffecient Supposons que nous ne pouvons pas changer le schéma..)

Répondre

86

les envelopper et utiliser les sous-requêtes:

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 

Voila!

+0

Cheers! Je savais que ça devait être quelque chose de simple comme ça. – Runcible

+0

comment pouvons-nous l'obtenir sans sous-requête –

+0

Vous avez sauvé ma journée. Je vous remercie. –

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

Selon la quantité de cette requête est susceptible d'être exécuté et à quelle fréquence les modifications de données, vous pouvez régulièrement mettre les données dans une table agrégée comme ceci:

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

Performance sage qui serait s * * t chaud rapidement et évite les sous-requêtes désagréables.

3

Essayez celui-ci ...

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; 
+0

Donnez une description à votre réponse s'il vous plaît. – MKR

Questions connexes