JeuWeb - Crée ton jeu par navigateur
[SQL]GROUPY BY - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [SQL]GROUPY BY (/showthread.php?tid=1856)



[SQL]GROUPY BY - Loetheri - 07-10-2007

Petit problème à propos d'une requête SQL sur un serveur MySQL ^^

J'ai une série d'entrées dans ma table contenant un id, un titre et un texte.
Problème : je ne veux que le dernier élément par titre.
J'utilise donc un GROUP BY titre. Seulement il me tire le premier élément et non le dernier comme je le souhaite.

Code :
SELECT id, titre, texte, COUNT(titre) AS nombre FROM blop GROUP BY titre ORDER BY id DESC

Si ce n'est pas clair, dites-le.
J'ai essayé de faire un ORDER BY titre et sur id avec et sans DESC. Le GROUP BY doit être sur le titre.


RE: [SQL]GROUPY BY - Shiwa - 07-10-2007

Le GROUP BY sert à éliminer les doublons, il te permettra d'avoir un COUNT(titre) juste (et encore c'est pas sûr, il faudrait vérifier dans quel ordre mySQL effectue les opérations), mais n'effectuera aucun tri. D'ailleurs pour le COUNT, il semblerait qu'il existe un mot clé DISTINCT pour éliminer les doublons. Mieux vaut l'utiliser, ça me parait plus sûr.
Si tu veux le dernier élément par titre, il faut un ORDER BY titre (et certainement pas un ORDER BY id).
Tu peux rajouter un LIMIT 1 pour ne récupérer qu'un seul résultat (même si je ne sais pas si ça apporte grand chose si ton script PHP ne fait qu'un seul fetch_array).

Essaie en remplaçant ta requête par les deux suivantes, à éxecuter et à analyser séparément, on y verra déjà plus clair si ça pose encore problème:
Code :
SELECT id, titre, texte FROM blop ORDER BY titre LIMIT 1
SELECT COUNT(DISTINCT titre) AS nombre FROM blop



RE: [SQL]GROUPY BY - arcanis - 07-10-2007

Pour être sûr du dernier élément, je mettrais un ORDER BY `titre` DESC ou ORDER BY `titre`,`id` DESC
Le LIMIT 1 servira surtout à optimiser le temps de traitement. Ca évitera à MySQL de parcourir toute la table (enfin je crois...je crois qu'il y a un article sur le SdZ qui en parle, quand ils ont fait leur migration vers PgSQL).


RE: [SQL]GROUPY BY - Loetheri - 07-10-2007

Code :
SELECT COUNT(DISTINCT titre) AS nombre FROM wiki
Ce code fonctionne et me donne le bon nombre.

Maintenant, si j'essaye de faire une requête regroupant et le nombre et les id et les textes, cela ne fonctionne pas. Je suis obligé de faire un GROUP BY.

Je veux avoir le dernier id pour un même titre. Je ne cherche pas à limiter ma recherche. je veux tous les élements ayant un nom identique tout en sachant combien d'éléments ont un même nom et en récupérant le dernier id.

En somme, pour être très clair, on peut considérer ces différentes entrées :
Code :
id - titre - texte
1 - Test - Blop
2 - Blip - Scnump
3 - Test - Texte est gros
4 - Test - Texte est gros et bête
5 - Blip - Schnopfs
6 - Toto - Maman_a_toto
En effectuant ma requête, j'aimerais avoir :
Code :
id - Titre - texte - nombre
4 - Test - Test est gros et bête - 3
5 - Blip - Schnopfs - 2
6 - Toto - Maman_a_toto - 1

Or dans ma requête, j'ai :
Code :
id - Titre - texte - nombre
1 - Test - Blop - 3
2 - Blip - Scnump
6 - Toto - Maman_a_toto

Pour la requête SELECT id, titre, texte FROM blop ORDER BY titre, tout fonctionne normallement. Là n'est pas le problème.

Je précise que je ne tiens pas à faire de multiples requêtes.


RE: [SQL]GROUPY BY - Bob le Pointu - 07-10-2007

J'ai une solution, mais elle est assez lourde, mais elle fonctionne. Elle consiste à utiliser les sous-requêtes.

Code :
SELECT t1.id,
             t1.titre,
             t1.texte,
             (
              SELECT COUNT(*)
                FROM blop t3
                WHERE t3.titre = t1.titre
              ) nombre
  FROM blop t1
  WHERE t1.id IN
  (
    SELECT MAX(t2.id)
      FROM blop t2
      GROUP BY t2.titre
  )
  GROUP by t1.titre
  ORDER BY t1.titre

Bon appétit.