2015-09-15 10 views
6

Mam dość prosty select, powiedzmy:Najprostszy sposób prowadzenia same SELECT na wielu danych w MySQL

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

mogę uruchomić to select w jakiś prosty sposób, nie tylko na dany dzień, ale także dla, powiedzmy, 7 dni, przy czym każdy wiersz pokazuje się do tego konkretnego dnia?

EDIT: Oto mój SQL budowania tabeli:

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"); 

spodziewam spowodować tak:

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

Można utworzyć "Procedurę przechowywaną" i zaakceptować parametr dla daty. Ale nie jestem pewien, co rozumiesz przez "najprostszy sposób". – Siyual

Odpowiedz

3

Myślę, że chcesz coś takiego:

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 

ci może również użyć go do zliczania wszystkich rekordów przed < "2015-07-30" i ostatnich 7 dzień, ale będzie mieć złe występy, proponuję używać zapytań wbudowanych Zamiast:

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 

albo zapytania UNION:

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" 

Edit

podstawie Twojego komentarza, musisz użyć zapytania GROUP BY. Jeśli dodawane jest pole daty (bez informacji o czasie), można użyć tej kwerendy:

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

Edycja

To powinno być to, czego szukasz:

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

Dziękuję za pomoc, ale potrzebuję 7 wierszy zwróconych z wartością w każdym powiedzeniu, ile użytkowników zostało dodanych w systemie do tego dnia. Mogę to zrobić za pomocą 7 SELECTS + UNION, ale chciałbym to później parametryzować. –

+0

@ ZbigniewKisły zobacz moją zaktualizowaną odpowiedź – fthiella

+1

@downvoters Wiem, że ta odpowiedź nie jest tym, o co prosi OP, ale OP ciągle zmienia wymagania;) – fthiella

Powiązane problemy