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