2010-03-29 6 views
0

Je dois être en mesure d'afficher les données que j'ai par incréments de 15 minutes dans différents types d'affichage. J'ai deux requêtes qui me posent problème. L'un montre les données par une demi-heure, l'autre montre les données par heure. Le seul problème est que les totaux de données changent entre les requêtes. Il ne compte pas les données qui se produisent entre les délais, seulement aux intervalles de temps.Pourquoi mes fichiers MySQL Group By Hours et Half Hours ne sont-ils pas affichés?

Ex: Il y a 5 choses qui se produisent à 07h15. 2 cela se passe à 7h30 et 4 ce spectacle à 7h00.

La vue 15 minutes affiche toutes les données. La vue demi-heure affiche les données à partir de 7h00 et de 7h30 mais ignore les 7h15.
L'affichage de l'heure ne montre que les 7:00 données am

Voici mes questions:

$query="SELECT * FROM data WHERE startDate='$startDate' and queue='$queue' GROUP BY HOUR(start),floor(minute(start)/30)"; 

et

$query="SELECT * FROM data WHERE startDate='$startDate' and queue='$queue' GROUP BY HOUR(start) "; 

Comment puis-je retirer les données en groupes comme je l'ai mais je reçois toutes les données incluses?

est la question de la façon dont les données sont stockées dans la table mysql? Actuellement, j'ai une colonne avec des dates (2010-03-29) et une colonne avec des temps (00:00) Dois-je les convertir en quelque chose d'autre?

Répondre

3

Vous interprétez le « groupe par » mauvais. Vous ne "groupez" pas plusieurs enregistrements de sorte que vous pouvez les obtenir tous avec un seul appel fetchrow(). Ce qui se passe, c'est que la base de données va réduire tous les enregistrements correspondant aux clauses group-by dans un seul enregistrement. Prenez une simple table de score de jeu:

id playername score 
---------------------- 
1 John  23 
2 Fred  12 
3 Jack  9 
4 John  18 

Si vous avez fait la requête suivante: SELECT id, playername, score FROM table GROUP BY playername, vous obtiendrez l'ensemble de résultat suivant:

id playername score 
---------------------- 
1 John  23 
2 Fred  12 
3 Jack  9 

Hey! Où est passé John # 4? Il a disparu, car la ligne avec l'ID n ° 4 correspond à la clause GROUP BY et a été réduite à la première ligne correspondant à (# 1). Pas très utile en soi, vous avez maintenant perdu toutes les données associées à l'ID n ° 4. Mais c'est là les fonctions d'agrégation (somme, compter, en moyenne, etc ...) entrent en jeu: SELECT id, playername, SUM(score) FROM table GROUP BY playername:

id playername score 
---------------------- 
1 John  41 <---notice the change (23 + 18 = 41) 
2 Fred  12 
3 Jack  9 

Avec vos requêtes, vous avez deux choix:

  1. Laisser GROUP BY tel quel, et effectuez les calculs souhaités sur les données regroupées dans la requête (sommation, comptage, moyennage, etc ...)
  2. Supprimez les clauses GROUP BY, effectuez les calculs souhaités dans votre application.
  3. Convertissez les clauses GROUP BY dans les champs de résultat de la requête afin de pouvoir traiter les demandes. par période dans votre code basé sur ces nouvelles colonnes: SELECT *, HOUR(start), FLOOR(MINUTE(start)/30) FROM data
+0

J'y suis allé avec l'option un. Merci de votre aide. J'ai fait plus de sens, je me suis sentie stupide mais quand ça a marché exactement comme je le voulais, le sentiment stupide s'est évanoui. Merci beaucoup! – stogdilla

1

GROUP BY ne va pas et que vous n'utilisez une fonction d'agrégation dans votre requête. Déposez le GROUP BY, la base de données doit maintenant deviner quels enregistrements elle doit sélectionner. Et la base de données ne devrait pas deviner, ils doivent obtenir la bonne réponse et seulement la bonne réponse.

Changer le SQL MODE et créer une requête correcte.

+0

Donc, vous dites que je vais mal à propos de la solution? Je me rapproche de ce que je veux mais pas exactement. Pouvez-vous me montrer dans la bonne direction comment je devrais interroger ma base de données pour regrouper les enregistrements par incréments d'une demi-heure et d'une heure? – stogdilla