Wie füge ich zwei count (*) Ergebnisse zusammen auf zwei verschiedenen Tabellen?

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

  •  05-07-2019
  •  | 
  •  

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

War es hilfreich?

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;

Auswahl aus der DUAL Tabelle

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top