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

StackOverflow https://stackoverflow.com/questions/826365

  •  05-07-2019
  •  | 
  •  

Question

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 souhaite une requête qui me donne le nombre total de jouets + jeux auxquels participe un peu_kid.

En gros, 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 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 élaboré rend le schéma inefficace. Supposons que nous ne puissions pas changer le schéma.)

Était-ce utile?

La solution

Emballez-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!

Autres conseils

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
)
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 DOUBLE

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 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)
);

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

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
  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
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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top