2010-11-11 2 views
0

J'ai la requête SQL en cours pour sélectionner les demandes par heure:Comment puis-je éviter les lacunes lors de la sélection par heure dans MySQL?

SELECT ((FLOOR(unix_timestamp(request_when)/(60*60))*(60*60))*1000) as request_when, COUNT(*) as amount 
FROM api_requests WHERE request_when BETWEEN SUBDATE(NOW(), INTERVAL 12 HOUR) AND NOW() 
GROUP BY HOUR(request_when) ORDER BY id DESC; 

Le problème est que quand il y a 0 lignes, il ne retourne pas tout de suite, ce qui est prévu en fonction de la requête. Cependant, je voudrais qu'il renvoie 0 (avec le datetime/timestamp correct). J'ai joué avec d'autres requêtes mais aucune d'entre elles ne semble fonctionner.

Un exemple de sortie de ce qui se passe maintenant:

1289516400000 6 
1289512800000 15 
1289509200000 11 
1289505600000 31 
1289476800000 3 

Vous remarquerez qu'il a sauté quelques heures. Si vous ne vous sentez pas envie de faire le calcul, les valeurs datetime de ces horodateurs sont

2010-11-11 12:00:00 3 
2010-11-11 20:00:00 31 
2010-11-11 21:00:00 11 
2010-11-11 22:00:00 15 
2010-11-11 23:00:00 7 

Je voudrais que le temps sans lignes (heures 13-19, par exemple) pour revenir « 0 » au lieu de pas de ligne . Cela rendrait ma sortie a voulu ressembler à ceci:

2010-11-11 12:00:00 3 
2010-11-11 13:00:00 0 
2010-11-11 14:00:00 0 
2010-11-11 15:00:00 0 
2010-11-11 16:00:00 0 
2010-11-11 17:00:00 0 
2010-11-11 18:00:00 0 
2010-11-11 19:00:00 0 
2010-11-11 20:00:00 31 
2010-11-11 21:00:00 11 
2010-11-11 22:00:00 15 
2010-11-11 23:00:00 7 

je suis allé de l'avant et créé une table « aide » ou « charge », avec les heures 00-23, et j'ai essayé d'utiliser un RIGHT JOIN à lui, mais ma requête renvoie 0 lignes et ne fonctionne pas du tout. Cette requête qui ne fonctionne pas ressemble à ceci:

SELECT ((FLOOR(unix_timestamp(request_when)/(60*60))*(60*60))*1000) as request_when, IFNULL(COUNT(*),0) as amount 
FROM api_requests RIGHT JOIN _filler ON (HOUR(api_requests.`request_when`) = _filler.`hours`) 
WHERE request_when BETWEEN SUBDATE(NOW(), INTERVAL 12 HOUR) AND NOW() GROUP BY HOUR(request_when) ORDER BY api_requests.id DESC; 
+0

Exemples de données et de valeurs attendues? – Danosaure

+0

Ajout de valeurs attendues et de plus de détails. – RSully

Répondre

0

Sélectionnez les valeurs dans votre table de remplissage au lieu de la table de données. Je le reformulerais comme

select ... from _filler left join api_requests ... 
+0

Cela ne semble pas fonctionner non plus. – RSully

+0

'LEFT JOIN' Fonctionne ici, en regroupant par' _filler.hours' – Wrikken

+0

J'essaie ceci: SELECT ... FROM _filler LEFT JOIN api_requests ON (HOUR (api_requests.'request_when') = HEURE (_filler.'heures') WHERE (api_requests.request_when ENTRE SOUS-DATE (MAINTENANT(), INTERVALLE 12 HEURES) ET MAINTENANT()) GROUP BY HOUR (_filler.hours) ORDER BY api_requests.id DESC; – RSully

Questions connexes