prob de ORDER BY/GROUP BY

jerome67
Invité n'ayant pas de compte PHPfrance

30 mars 2008, 13:37

Bonjour tout le monde,

voici la page qui me pose problème ==> http://www.orchestre-megaboys.fr/dates.php
Vous voyez bien que les dates ne sont pas dans le bon ordre....

voici ma requete :

Code : Tout sélectionner

$requete = mysql_query("SELECT id_dates, MONTH(time) AS 'mois', YEAR(time) AS 'annee', Jour_lundi, Type_de_soirée, Lieu, renseignement, GROUP_CONCAT(time SEPARATOR ',') AS 'date' FROM dates GROUP BY mois ");

Vous allez me dire, "rajoute un ORDER BY date apres mon GROUP BY mais rien n'y fait il n'y a aucun changement... je ne comrpends, comment remedier à tous cela?

Voila le code qui affiche les dates au cas ou (pour vous montrer comment je procède)....

Code : Tout sélectionner

echo "<tr><td colspan=5 bgcolor='#BE3B13'><font color=#FFFFFF><b>".$Mois. " " . $resultat['annee']. "</td></tr>"; $mesdate = explode(',' , $resultat['date']); foreach($mesdate as $madate) { $requete2 = mysql_query("SELECT * FROM dates WHERE time = '".$madate."' "); $resultat2 = mysql_fetch_array($requete2); echo "<tr><td><b>".$resultat2['Jour_lundi']." ".date('d',strtotime($madate)). "</b></td><td><b>".$resultat2['Type_de_soirée']."</b></td><td>".$resultat2['Lieu']."</td><td>".$resultat2['renseignement']."</td><td>".date('H:i',strtotime($madate))."</td></tr>"; } }

et voici ma TABLE dates ou se trouve les dates


CREATE TABLE IF NOT EXISTS `dates` (
`id_dates` int(11) NOT NULL auto_increment,
`time` datetime NOT NULL,
`Jour_lundi` text collate latin1_general_ci NOT NULL,
`Type_de_soirée` text collate latin1_general_ci NOT NULL,
`Lieu` text collate latin1_general_ci NOT NULL,
`renseignement` text collate latin1_general_ci NOT NULL,
`type` varchar(12) collate latin1_general_ci NOT NULL,
`envoi` varchar(4) collate latin1_general_ci NOT NULL,
PRIMARY KEY (`id_dates`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=6 ;

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 mars 2008, 14:25

Retire le GROUP BY, ajoute l'ORDER BY et sers-toi de PHP pour mettre les en-têtes des mois à chaque changement.

Remplace aussi mysql_fetch_array() par mysql_fetch_assoc()

jerome67
Invité n'ayant pas de compte PHPfrance

30 mars 2008, 15:18

Désolé mais avec l'utilisation de GROUP_CONCAT il est obligatoir d'inserrer un GROUP BY :?

Invité
Invité n'ayant pas de compte PHPfrance

30 mars 2008, 15:20

Désolé mais avec l'utilisation de GROUP_CONCAT il est obligatoir d'inserrer un GROUP BY :?
en fait, mon souci c"'est que le GROUP_CONCAT prend les date dans l'ordre ou elle se trouve dans la BDD hors, certaine date ne sont pas enregistrées dans l'ordre chronologique, il faudrait donc dire à GROUP_CONCAT de prendre les dates mais dans le bon ordre...

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 mars 2008, 15:23

En fait il te faut aussi retirer le GROUP_CONCAT(). Tu groupes en SQL, tu dégroupes en PHP, ce n'est pas logique. Retire toute logique de groupement de MySQL, récupère les enregistrements dans l'ordre et utilise PHP pour afficher les en-têtes là où ça va bien.

Invité
Invité n'ayant pas de compte PHPfrance

30 mars 2008, 15:27

vé voir....

cependant tu m'as dit d'utiliser fetch_assoc plutot que fetch_array...
tu m' as donné les liens pour comprendre la diference entre ces deux fonction, mais je n'entrouve pas... je ne comprend pas pourquoi assoc plutot que array

jerome67
Invité n'ayant pas de compte PHPfrance

30 mars 2008, 15:33

sinon j'avais penssé a ne pas grouper en SQL mais mon souci c'est comment n'afficher qu'une fois la barre avec le mois et l'annéee.... voir http://www.orchestre-megaboys.fr/dates.php

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 mars 2008, 15:41

mysql_fetch_assoc() fais exactement ce dont tu as besoin, mysql_fetch_array() fais des trucs en plus dont tu ne te sers pas. En gros, tu as besoin d'un couteau et tu utilises un couteau suisse.

Pour ton "groupement-qui-n'en-est-pas-un", il faut que tu t'en occupes en PHP. Par exemple,
$mois = '';
while ($row = mysql_fetch_assoc($result))
{
    if ($mois != $row['mois'])
    {
        $mois = $row['mois'];
        // afficher bandeau
    }
}
A chaque changement de mois, tu réaffiches le bandeau.

Au fait, le texte "SELECT ..." s'appelle une requête. Ce que renvoit mysql_query() c'est un résultat. Si tu appelles ton résultat $requete, un jour ou l'autre ça va te jouer des tours.

Invité
Invité n'ayant pas de compte PHPfrance

30 mars 2008, 15:52

MERCI, en fait, j'ai cherchais à faire compliqué alors que c'est pas si ardu que ca

merci

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 mars 2008, 16:17

On a moins de chances de se planter en allant vers le plus simple :P