2016-06-03 11 views
0

ich eine Tabelle, die so ziemlich sieht wie folgt aus: users (id INT, masterId INT, date DATETIME)MySQL kombinieren 2 verschiedenen Zählungen in einer Abfrage

Jeder Benutzer genau ein Master hat. Aber Meister können n Benutzer haben.

Jetzt möchte ich herausfinden, wie viele Benutzer jeder Master hat. Ich mache das so:

SELECT `masterId`, COUNT(`id`) AS `total` FROM `users` GROUP BY `masterId` ORDER BY `total` DESC 

Aber jetzt weiß ich möchte auch, wie viele neue Benutzer ein Meister seit den letzten 14 Tagen hat. Ich kann es mit dieser Abfrage tun:

SELECT `masterId`, COUNT(`id`) AS `last14days` FROM `users` WHERE `date` > DATE_SUB(NOW(), INTERVAL 14 DAY) GROUP BY `masterId` ORDER BY `total` DESC 

Jetzt die Frage: Kann ich irgendwie diese Informationen erhalten mit einer Abfrage, anstelle von 2-Abfragen mit?

Antwort

1

Sie können die bedingte Aggregation verwenden, indem Sie nur Zeilen zählen, für die die Bedingung wahr ist.

SELECT 
    masterId, 
    COUNT(id) AS total, 
    SUM(CASE WHEN date > DATE_SUB(NOW(), INTERVAL 14 DAY) THEN 1 ELSE 0 END) AS last14days 
FROM users 
GROUP BY masterId 
ORDER BY total DESC 

Sample SQL Fiddle

+0

Diese Abfrage zeigt exakt die gleichen Werte für die Gesamt und last14days – pimeys

+0

@pimeys in jeder Zeile habe ich die Abfrage aktualisiert: Im Standard-SQL würde dies innerhalb der Aggregatfunktion mit einem Fall Ausdruck erfolgen also sollte es jetzt funktionieren. – jpw

+0

Super, danke! – pimeys

Verwandte Themen