web-dev-qa-db-fra.com

Comment ajouter deux résultats de comptage (*) sur deux tables différentes?

J'ai deux tables: jouets et jeux.

+--------------------+------------------+
| 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 participe un peu_kid.

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

 CHOISISSEZ LE COMPTE (*) DANS LES Jouets WHERE little_kid_id = 900; 
 CHOISISSEZ LE COMPTE (*) dans Games WHERE little_kid1 = 900 
 OR little_kid2 = 900 
 OR little_kid3 = 900; 

Est-il possible d'obtenir cela 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 artificiel rend le schéma inefficace. Supposons que nous ne puissions pas changer le schéma.)

49
Runcible

Enveloppez-les et utilisez des 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!

108
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

Essaye celui-là...

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

En fonction du nombre de fois que cette requête est susceptible d'être exécutée et de la fréquence à laquelle les données changent, vous pouvez périodiquement placer des 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)
);

En termes de performances, ce serait très rapide et éviterait les mauvaises requêtes.

4
James C
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;

Sélection dans la table DUAL

3
anish
  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