[PHP] tri sur group by

Résolu
okuni Messages postés 1325 Statut Membre -  
okuni Messages postés 1325 Statut Membre -
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 :)

--
L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

11 réponses

  1. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    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
  2. okuni Messages postés 1325 Statut Membre 126
     
    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
  3. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    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
  4. okuni Messages postés 1325 Statut Membre 126
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    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
  7. okuni Messages postés 1325 Statut Membre 126
     
    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
  8. okuni Messages postés 1325 Statut Membre 126
     
    Alors avion-f16, tu n'as pas une idée?
    0
  9. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    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
  10. okuni Messages postés 1325 Statut Membre 126
     
    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
  11. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     
    Oui, désolé.
    Remplace
    $titres[$titre->id] = $titre->titre;
    Par
    $titres[$titre->numero] = $titre->titre;
    0
  12. okuni Messages postés 1325 Statut Membre 126
     
    Ok, en adaptant un peu le code, j'ai trouvé ce qu'il me fallait.
    merci beaucoup.
    0