Wie füge ich zwei count (*) Ergebnisse zusammen auf zwei verschiedenen Tabellen?
Frage
Ich habe zwei Tabellen:. Spielzeug und Spiele
+--------------------+------------------+
| 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 |
+--------------------+------------------+
Ein kleines Kind kann mehrere Spielzeug hat. Ein kleines Kind kann auf einmal in mehreren Spielen teilnehmen.
Ich möchte eine Abfrage, die mir die Gesamtzahl von Spielzeug + Spiele geben, dass ein little_kid mit beteiligt ist.
Im Grunde möchte ich die Summe dieser beiden Abfragen:
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;
Ist es möglich, diese in einer einzigen SQL-Abfrage zu bekommen? Natürlich, ich kann sich programmatisch summieren, aber das ist weniger wünschenswert.
(Ich weiß, dass das erfundene Beispiel das Schema Blick effizient ist macht. Nehmen wir an, dass wir nicht das Schema ändern können.)
Lösung
Wickeln Sie sie und verwenden Unterabfragen:
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!
Andere Tipps
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;
Je nachdem, wie viel diese Abfrage ist wahrscheinlich ausgeführt werden soll und wie oft die Datenänderungen, die Sie in regelmäßigen Abständen Daten in einer aggregierten Tabelle wie folgt setzen könnte:
CREATE TABLE aggregated (
little_kid_id INT UNSIGNED,
games_count INT UNSIGNED,
toys_count INT UNSIGNED,
PRIMARY KEY (little_kid_id)
);
Performance weist, dass seine s würde ** t heiß schnell und vermeidet unangenehme Unterabfragen.
Dieses eine Try ...
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