Sql : regrouper plusieur entrées par date

Fermé
madzorg - 23 mai 2008 à 11:30
 TiTO - 22 janv. 2009 à 00:38
Bonjour,
Je souhaiterai afficher un ensemble de ligne extraite d'une table en les regroupant par date, dans ce style :

Date1 : - ligne1
- ligne2
Date2 : - ligne3
- ligne4
- ligne5

etc...

J'arrive bien a selectionner les lignes, je souhaiterai juste eviter lors de l'affichage une répétition de la date lorsque j'ai plusieurs lignes ayant la meme date, cad ne pas avoir un truc comme ca :

Date1 : - ligne1
Date1 : - ligne2
Date2 : - ligne3
Date2 : - ligne4
Date2 : - ligne5

Merci d'avance !!

8 réponses

morgbl Messages postés 2 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 15 novembre 2008 1
15 nov. 2008 à 21:07
Bon j'ai trouvé un truc qui fonctionne mais si vous avez une meilleure idée n'hésitez pas...

Alors voici le principe :

1) Je vais rechercher toutes les dates dans la base avec un DISTINCT pour éviter les doublons

2) Je stocke les dates dans un tableau

3) Avec un foreach($tab as $cle=>$valeur), j'affiche une à une les dates du tableau et pour chacune de ces dates, à l'aide d'une requête, je sélectionne dans la base les lignes correspondant à cette même date.

J'obtiens ainsi :

date 1
- ligne 1
- ligne 2
...

date 2
- ligne 3
- ligne 4
...
1
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
23 mai 2008 à 11:31
Quelle requête sql utilises-tu ?
0
C'est pour mon taf, je m'occupe d'une petite base de donnée qui stock des infos sur des mesures. La requete sert dans une page permettant d'afficher un planning mensuel, cad afficher toutes les mesures effectuées chaque jour... La requete est un peu longue mais bon... il faut que je mette un GROUP BY qqpart ?


SELECT DISTINCT date AS "DatePlanif", idMesure AS "Mesure", typeOperation AS "Type",
techno AS "Technologie", protocole AS "Protocole", client AS "Client", etat, commentaire
FROM Mesure, Planifie, TypeMesure, Estdetype
WHERE Planifie.Mesure_idMesure = Mesure.idMesure
AND Mesure.idMesure = Estdetype.Mesure_idMesure
AND TypeMesure.idTypeMesure = Estdetype.TypeMesure_idTypeMesure
AND YEAR(Planifie.date) = '.$da.'
AND MONTH(Planifie.date) = '.$noMois.'+1
AND (Mesure.etat = "plan" OR Mesure.etat = "fait")
ORDER BY Planifie.date ASC
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
23 mai 2008 à 13:45
le GROUP BY est à mettre à la fin et je ne vois pas l'utilité du DISTONCT au début.
0
Moi non plus mais sans le DISTINCT j'ai des truc bizarres..
Le GROUP BY ne fait pas ce que je veux..

Je précise qu'il s'agit de MySQL sous php..
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
23 mai 2008 à 13:57
Décris les "trucs bizarres" pour que je puisse t'aider.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Sans le distinct j'ai des mesures qui apparaissent plusieurs fois le meme jour.... Une meme mesure peut apparaitre sur plusieurs jours d'affilés (et c'est normal), mais une meme mesure plusieurs fois le meme jour ca c'est louche.

Avec un group by je me retrouve avec une seule ligne par jour alors qu'il peut y avoir plusieurs mesure. il m'affiche une seule mesure et "mange" les autres..
0
croy Messages postés 453 Date d'inscription samedi 19 janvier 2008 Statut Membre Dernière intervention 23 octobre 2012 114
23 mai 2008 à 14:25
Si je comprends bien ton pb, tu dois utiliser une requête comme :
SELECT date AS "DatePlanif", idMesure AS "Mesure", typeOperation AS "Type",
techno AS "Technologie", protocole AS "Protocole", client AS "Client", etat, commentaire
FROM Mesure, Planifie, TypeMesure, Estdetype
WHERE Planifie.Mesure_idMesure = Mesure.idMesure
AND Mesure.idMesure = Estdetype.Mesure_idMesure
AND TypeMesure.idTypeMesure = Estdetype.TypeMesure_idTypeMesure
AND YEAR(Planifie.date) = '.$da.'
AND MONTH(Planifie.date) = '.$noMois.'+1
AND (Mesure.etat = "plan" OR Mesure.etat = "fait")
ORDER BY Planifie.date ASC


Ni DISTINCT ni GROUP BY.

SI tu as des mesures qui apparaissent plusieurs fois le même jour, ce doit être parceque les jointures de table remontent plusieurs combinaisons.

Suppose deux tables :
- table temp1 : 2 colonnes id et clef. Un seul enregistrement avec id=1 et clef=100
- table temp2 : 2 colonnes clef et lib. Deux enregistrements : 100, 1234 et 100, 4321 (ces deux enregistrements ont la même valeur de clef

La requête select id,temp1.clef,lib from temp1,temp2 where temp1.clef=temp2.clef;
retournera deux enregistrements bien qu'il n'y en ait qu'un dans temp1.

La requête select DISTINCT id,temp1.clef,lib from temp1,temp2 where temp1.clef=temp2.clef;
retournera les deux mêmes enregistrements car leurs valeurs sont bien distinctes (colonne lib)

Par contre la requête select DISTINCT id,temp1.clef from temp1,temp2 where temp1.clef=temp2.clef;
ne retourne qu'un enregistrement car la variable temp2.lib n'est plus retournée et ne distingue donc plus les deux enregistrements.

Il faut que tu comprennes bien ce qui ci-dessus, que tu analyses pourquoi plusieurs enregistrements sont retournés par ta requête et si c'est normal.

Si c'est normal, expose cela clairement et nous verrons ce qu'il est possible de faire.
0
morgbl Messages postés 2 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 15 novembre 2008 1
15 nov. 2008 à 19:40
Bonjour,

J'ai le même problème que Madzorg, je souhaite afficher

date 1
ligne 1
ligne 2
date 2
ligne 4
ligne 5
...

au lieu de :

date 1 - ligne 1
date 1 - ligne 2
date 2 - ligne 3
date 2 - ligne 4

Personne pour aider à résoudre ce problème ?
0
Salut,
Est-ce que tu pourrais donner ton bon de code que tu as utiliser avec la fontion "foreach" ! Parce que je reste blocker sur cette fonction. J'arrive a obtenir la liste des jours avec le foreach mais je n'arrive pas a trouver la suite pour inclure la suite des données et les comparer aux dates pour qu'elles s'affichent par rapports jours.
MERCi
0