2010-03-08 8 views
5

Je veux obtenir les données tous les jours dans l'année en arrière, mais je dois utiliser 365 requêtes pour chaque jour comme:Comment utiliser une seule requête pour obtenir les données chaque jour dans l'année?

for ($i = 0; $i<365; $i++){ 
    $end_day = ...; // the end time of each day 
    $start_day = ...; // the start time of each day 
    $query = select count(*)....where created < $end_day AND created > $start_day 
} 

Je pense que ma solution actuelle rend le système très lent. Est-il possible de n'utiliser qu'une seule requête?

Répondre

4

Si l'on suppose que votre colonne créée est un DATETIME ou TIMESTAMP, et les données stockées sont plus granulaire qu'un jour:

SELECT COUNT (*) ... GROUP BY AN (créé), le mois (créé), DAY (created)

COUNT est une fonction agrégée qui s'appliquera à chaque groupe, c'est-à-dire que vous aurez une ligne par groupe et que cette ligne aura le nombre d'enregistrements dans ce groupe. Comme nous avons fait un groupe par jour, ce sont les données que vous voulez.

Vous ne pouvez pas simplement grouper DAY (créé) car DAY renvoie le jour du mois, donc nous devons également mettre mois et année pour nous assurer que les jours sont discrets.

Vous avez probablement besoin d'un WHERE créé> $ start ET créé < $ finish pour le limiter à un certain laps de temps (ou un WHERE YEAR (créé) == 2010).

Références:

MySQL Query GROUP BY day/month/year

http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html

1

Si c'est une colonne datetime déjà:

SELECT COUNT(*),DATE(created) as d ..... GROUP BY d; 

Si c'est stocké comme un timestamp unix:

SELECT COUNT(*),DATE(FROM_UNIXTIME(created)) as d ..... GROUP BY d; 

Fondamentalement, vous pouvez utiliser le Mysql Date and Time functions pour formater la colonne de telle sorte que vous obteniez juste une date, puis grouper par ces dates pour obtenir un compte pour chaque date.

Questions connexes