2015-09-15 7 views
6

ho abbastanza semplice selezionare, diciamo:più semplice modo di gestire lo stesso SELEZIONA sui dati più in MySQL

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

Posso eseguire questo selezionare in qualche modo semplice non solo per la data indicata, ma anche per, diciamo, 7 giorni, ogni riga che mostra conta fino a quel giorno specifico?

EDIT: Ecco la mia SQL costruire una tabella:

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

mi aspetto risultare così:

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

È possibile creare una 'Stored procedure' e accettare un parametro per la data. Ma non sono sicuro di cosa intendi per "modo più semplice". – Siyual

risposta

3

Penso che si desidera qualcosa di simile:

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 

voi può anche usarlo per il conteggio di tutti i record prima dello < "2015-07-30" e degli ultimi 7 giorni, ma avrà cattive prestazioni, vorrei suggerire di utilizzare le query in linea invece:

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 

o una query 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" 

Modifica

Sulla base di un commento, è necessario utilizzare una query GROUP BY. Se aggiunto è un campo data (senza informazioni di tempo) è possibile utilizzare questa query:

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

Modifica

Questo dovrebbe essere quello che stai cercando:

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

Grazie per l'aiuto, ma ho bisogno di 7 righe restituite con valore in ogni frase, quanti utenti sono stati aggiunti in un sistema fino a quel giorno. Posso farlo con 7 SELECTS + UNION, ma mi piacerebbe parametrizzarlo in seguito. –

+0

@ ZbigniewKisły si prega di vedere la mia risposta aggiornata – fthiella

+1

@downvoters so che questa risposta non è quello che sta chiedendo OP, ma l'OP continua a cambiare i requisiti;) – fthiella

Problemi correlati