2015-09-15 3 views
6

Ich habe ziemlich einfach wählen, sagen wir mal:einfachste Weg, diese auf mehrere Daten in MySQL SELECT laufen

SELECT COUNT(added) FROM users WHERE added < "2015-07-30" 

Kann ich diese wählen in einigen einfachen Art und Weise nicht nur für das angegebene Datum laufen, sondern auch für die, sagen wir, 7 Tage, jede Zeile zeigt bis zu diesem bestimmten Tag an?

EDIT: Hier ist meine SQL Aufbau einer Tabelle:

CREATE TABLE users (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
added DATE 
); 

INSERT INTO users (added) VALUES ("2015-07-30"); 
INSERT INTO users (added) VALUES ("2015-07-29"); 
INSERT INTO users (added) VALUES ("2015-07-28"); 
INSERT INTO users (added) VALUES ("2015-07-21"); 
INSERT INTO users (added) VALUES ("2015-07-26"); 
INSERT INTO users (added) VALUES ("2015-07-25"); 
INSERT INTO users (added) VALUES ("2015-07-24"); 
INSERT INTO users (added) VALUES ("2015-07-23"); 
INSERT INTO users (added) VALUES ("2015-07-29"); 
INSERT INTO users (added) VALUES ("2015-07-22"); 
INSERT INTO users (added) VALUES ("2015-07-20"); 
INSERT INTO users (added) VALUES ("2014-02-10"); 

ich so ergeben erwarten:

DATE | Count | 
--------------------     
2015-07-30 | 12 | 
2015-07-29 | 11 | 
2015-07-28 | 10 | 
2015-07-27 | 9 | 
2015-07-26 | 9 | 
2015-07-25 | 8 | 
2015-07-24 | 7 | 
+0

Sie könnten eine Stored Procedure erstellen und einen Parameter für das Datum akzeptieren lassen. Aber ich bin mir nicht sicher, was Sie mit "einfachste Art" meinen. – Siyual

Antwort

3

Ich glaube, Sie so etwas wie dies wollen:

SELECT 
    SUM(added >= CURRENT_DATE() - INTERVAL 14 DAY) AS last_14_days, 
    SUM(added >= CURRENT_DATE() - INTERVAL 7 DAY) AS last_7_days, 
    SUM(added = CURRENT_DATE()) AS today 
FROM users 
WHERE 
    added >= CURRENT_DATE() - INTERVAL 14 DAY 

Sie kann es auch zum Zählen aller Datensätze vor < "2015-07-30" und den letzten 7 verwenden Tage, aber es wird schlechte Leistungen haben, würde ich vorschlagen, dass Sie Inline-Abfragen verwenden, anstatt:

SELECT 
    (SELECT COUNT(added) FROM users WHERE added < "2015-07-30") AS before_30, 
    (SELECT COUNT(added) FROM users WHERE added >= "2015-09-08") AS last_7 

oder eine UNION-Abfrage:

SELECT "Before 30" as Interval, COUNT(*) AS total 
FROM users WHERE added < "2015-07-30" 
UNION ALL 
SELECT "Last 7" as Interval, COUNT(*) AS total 
FROM users WHERE added >= "2015-09-08" 

bearbeiten

Basierend auf Ihren Kommentar, Sie müssen eine GROUP BY-Abfrage verwenden. Wenn hinzugefügt ein Datumsfeld (ohne Zeitinformation) Sie diese Abfrage verwenden können:

SELECT added, COUNT(*) 
FROM users 
WHERE added >= CURRENT_DATE() - INTERVAL 7 DAY 
GROUP BY added 

bearbeiten

sollte das sein, was Sie suchen:

SELECT d.added, COUNT(*) 
FROM 
    (SELECT DISTINCT added 
    FROM users 
    WHERE added BETWEEN "2015-07-30" - INTERVAL 30 DAY AND "2015-07-30") AS d 
    INNER JOIN users 
    ON users.added <= d.added 
GROUP BY 
    d.added 
ORDER BY `d`.`added` DESC 

SQLFiddle here

+0

Vielen Dank für die Hilfe, aber ich brauche 7 Zeilen mit Wert zurückgegeben in jeder sagen, wie viele Benutzer in einem System bis zu diesem Tag hinzugefügt wurden. Ich kann es mit 7 SELECTS + UNION tun, aber ich möchte es später parametrisieren. –

+0

@ ZbigniewKisły siehe meine aktualisierte Antwort – fthiella

+1

@ downvoters Ich weiß, dass diese Antwort nicht das ist, was OP verlangt, aber das OP ändert ständig die Anforderungen;) – fthiella

Verwandte Themen