[PHP] tri sur group by

Résolu/Fermé
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 - 6 mai 2010 à 17:38
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 - 9 mai 2010 à 20:52
Bonjour,
J'aimerais savoir s'il est possible "d'inverser" le grou by.
Je m'explique :
J'ai une table comme suis
id	titre	numero
4	titre 4	1
3	titre 3	1
2	titre 2	1
1	titre 1	1

si je fais un select avec group by numero, j'aurai uniquement la ligne ocrrespondant à id 1 avec titre 1.

Ce que j'aimerais c'est afficher titre 4 uniquement

ps : il y a bien sur d'autre donnée, d'autre numéro, le but ici serait d'afficher les x derniers ajout de la table en groupant les données par 'numero'

Merci pour vos aides :)
A voir également:

11 réponses

avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
6 mai 2010 à 18:50
Si tu n'utilises pas la clause WHERE, il n'y a pas de réponse pour que MySQL ne retourne qu'une ligne ...
Quelle est ta requête ?
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
6 mai 2010 à 19:17
D'ou l'utilité du group by.
$result_serie = mysql_query('SELECT e.id, e.titre FROM raynal_video_episode e WHERE type="1" ORDER BY e.id DESC '.$limit);

voila ma requete complète (pas faire attention au where type="1"
Donc dans mon exemple avec cette requete, je vais afficher
titre 4
titre 3
titre 2
titre 1

Mais j'aimerais afficher uniquement
titre 4

et pas titre 1 (c'est le résultat si j'utilise "group by e.serie")
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
6 mai 2010 à 19:50
Désolé, j'ai pris le "GROUP BY" pour un "ORDER BY".
"GROUP BY" est à utiliser avec des fonctions SQL. Il permet par exemple de calculer la somme (fonction SUM()) d'un champ en groupant toutes les entrées ayant un champ commun.
Tu as des exemples sur cette page :
https://www.w3schools.com/sql/sql_groupby.asp

Si tu veux uniquement la première entrée retournée par ta requête, alors n'utilise pas de boucle. À chaque fois que tu appelles la fonction mysql_fetch_assoc (ou _array, _object, ... | ou la méthode fetch() en PDO), ça appelle les lignes une par une.

<?php
$pdo = new PDO('mysql:host=localhost;dbnam=db_test','root','');

$sql = 'SELECT e.id, e.titre FROM raynal_video_episode e WHERE type="1" ORDER BY e.id DESC '.$limit;
$req = $pdo->query($sql);
$ligne1 = $req->fetch();
$req->closeCursor();

echo $ligne1['titre'];
?>
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
6 mai 2010 à 19:57
mais si je fait ça, j'aurai toutes les données même celle que je ne désire pas.

Je ne vois pas ce qui change dans ton code.
0

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

Posez votre question
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
6 mai 2010 à 20:01
Ce qui change dans mon code c'est qu'il n'y a pas de boucle : on ne fait qu'un fetch, donc que la première ligne retournée par la requête. Et si $limit vaut quelque-chose comme "LIMIT 0,1", alors il n'y a qu'une ligne.
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
6 mai 2010 à 20:45
ha ok, alors c'est mon exemple qui était mauvais, désolé.
En voici un plus complet
id	titre	numero
7	titre 7	3
6	titre 6	2
5	titre 5	2
4	titre 4	1
3	titre 3	1
2	titre 2	1
1	titre 1	1

voici ma table.
Ce que je veux afficher c'est uniquement :
titre 7
titre 6
titre 4
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
7 mai 2010 à 22:35
Alors avion-f16, tu n'as pas une idée?
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
7 mai 2010 à 22:40
Je n'ai pas d'idée pour la requête SQL.
Mais avec un array, c'est faisable.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=db_test','root','');

$sql = 'SELECT * FROM table ORDER BY id';
$req = $pdo->query($sql);
$req->setFetchMode(PDO::FETCH_OBJ);
$titres = array();

while($titre = $req->fetch()) {
    $titres[$titre->id] = $titre->titre;
}
$req->closeCursor();

foreach($titres as $num => $titre) {
    echo $num.' : '.$titre.'<br/>';
}
?>
Je n'ai pas testé mais ça devrait être ça.
$titres[2] contiendra donc "titre 6".
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
7 mai 2010 à 22:48
Merci mais dans ce cas ci, je vais de nouveau affiché
titre 7
titre 6
titre 5
titre 4
titre 3
titre 2
titre 1

au lieu de uniquement
titre 7
titre 6
titre 4


Je me trompe? (j'ai pas encore l'habitude d'utiliser pdo :p)
0
avion-f16 Messages postés 19246 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 21 avril 2024 4 497
7 mai 2010 à 23:39
Oui, désolé.
Remplace
$titres[$titre->id] = $titre->titre;
Par
$titres[$titre->numero] = $titre->titre;
0
okuni Messages postés 1221 Date d'inscription jeudi 4 septembre 2008 Statut Membre Dernière intervention 2 janvier 2014 126
9 mai 2010 à 20:52
Ok, en adaptant un peu le code, j'ai trouvé ce qu'il me fallait.
merci beaucoup.
0