it-swarm.com.de

Wie füge ich zwei Zählergebnisse (*) in zwei verschiedenen Tabellen zusammen?

Ich habe zwei Tische: 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 Spielzeuge haben ... Ein kleines Kind kann an mehreren Spielen gleichzeitig teilnehmen.

Ich möchte eine Abfrage, die mir die Gesamtzahl der Spielzeuge + Spiele gibt, an denen ein little_kid beteiligt ist.

Grundsätzlich möchte ich die Summe dieser beiden Abfragen:

 SELECT COUNT (*) VON Spielzeug, WO little_kid_id = 900; 
 SELECT COUNT (*) von Spielen, wo little_kid1 = 900 
 OR little_kid2 = 900 
 OR little_kid3 = 900; 

Ist es möglich, dies in einer einzigen SQL-Abfrage zu erhalten? Natürlich kann ich sie programmatisch zusammenfassen, aber das ist weniger wünschenswert.

(Mir ist klar, dass das Schema durch das erfundene Beispiel ineffektiv wirkt. Nehmen wir an, dass wir das Schema nicht ändern können.)

49
Runcible

Packen Sie sie zusammen und verwenden Sie 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!

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

Probier diese...

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

Abhängig davon, wie wahrscheinlich diese Abfrage ausgeführt wird und wie oft sich die Daten ändern, könnten Sie Daten regelmäßig in eine aggregierte Tabelle wie folgt einfügen:

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

In Bezug auf die Leistung wäre das sehr schnell und vermeidet unangenehme Unterabfragen.

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;

Auswahl aus der DUAL-Tabelle

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