Tom's Guide > Forum > Programmation > Eviter la rédondence
Mot :    Pseudo :           
 

Bonjour
J'ai créé une page afin de lister les derniers sujets d'un Forum selon le message

Code :
  1. $retour = mysql_query("SELECT * FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50" );



Mais il arrive qu'un même sujet (pid) revienne plusieurs fois, comment éviter cette redondance de même donnée ?
Merci :wahoo:


Message édité par Blacko@IDN le 16-11-2006 à 17:27:39
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

solution cochonne :
select distinct

------------------------------ Don't panic!
mouths91 à dit : "[...]des rageux comme kelnem"
Répondre à Vinz42

Merci pour ta réponse
J'avais déjà essayé ça

Code :
  1. $retour = mysql_query("SELECT distinct * FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50" );


Ca ne donne rien, des mêmes sujets reviennent plusieurs fois...
http://www.soccers.fr/dernieres-discussions.php


Message édité par Blacko@IDN le 16-11-2006 à 18:25:44
Répondre à Blacko@IDN

solution moins cochonne: GROUP BY:

Code :
  1. SELECT * FROM ipb_posts GROUP BY id ORDER BY pid DESC LIMIT 50


Le 0 du limit ne sert à rien, c'est l'offset de départ qui est égal à 0 s'il est omis :) Mais c'est effectivement plus propre de le mettre

------------------------------ Réseau IRC Francophone | g33k-zone
Défiez-moi donc !
Répondre à crazycat@idn

Code :
  1. group by id


avec un * comme liste de champs ca risque de ne pas marcher à part s'il n'y a que pid comme colonne

essaye de lister seulement les champs dont t'as besoin en utilisant distinct, ca devrait faire l'affaire.

Code :
  1. select distinct pid FROM ipb_posts ORDER BY pid DESC LIMIT 50


Message édité par coca25 le 16-11-2006 à 21:37:22
Répondre à coca25

heu, tu ne connais pas ipb?
ni même les forums?
pid représente souvent le Parent ID (donc le forum) et id l'IDentifiant unique du message.
Donc, un message dans la table post contient forcémment id et pid.
Et la requète fonctionne vu que je m'en sert :)
La tienne va renvoyer... une erreur vu que le champ de groupage n'est pas dans la liste des champs selectionnés :)


Message édité par crazycat@idn le 16-11-2006 à 21:30:01
------------------------------ Réseau IRC Francophone | g33k-zone
Défiez-moi donc !
Répondre à crazycat@idn

effectivement c'est le copie coller :), en fait je voulais enlever le group by...
et effectivement je ne connais pas ipb mais pour moi il fallait mettre une fonction d'aggregation (sum, max ou autre) si la colonne n'était pas groupée
mais comme tu utilises déjà la requête... j'apprends des choses, c'est bien ;)

Répondre à coca25

je ne t'en veux pas, petit scarabé :)
Mais en règle générale, pid = parent-id et c'est toujours lié à un champ id.
Et dans le cas présent, tu as peut-être raison (surement), j'ai mal lu la question: je pensais que c'était les derniers messages.
Je me fouetterais demain avec des orties :)

------------------------------ Réseau IRC Francophone | g33k-zone
Défiez-moi donc !
Répondre à crazycat@idn

ok, après une brève recherche sur internet pour parfaire mon savoir :D
il s'avère que cette fonctionnalité est propre à mysql...

Citation :


mysql> SELECT order.custid,customer.name,MAX(payments)
-> FROM order,customer
-> WHERE order.custid = customer.custid
-> GROUP BY order.custid;

En SQL standard, vous devriez ajouter la colonne customer.name à la clause GROUP BY. Avec MySQL, ce nom est redondant si vous n'utilisez pas le mode ANSI.

N'utilisez pas cette fonctionnalité si les colonnes que vous omettez dans la clause GROUP BY ne sont pas unique dans le groupe!! Vous auriez des résultats inattendus!

Répondre à coca25

oui, le fonctionnement du group by sur MySQL est parfois déconcertant, mais dans le cas présent il permet de simplifier.
En reprenant ta requète exemple, si tu ajoutait customer.name dans le group by, tu pourrais obtenir le double de résultats (chaque groupe de custid et chaque groupe de name), ou aucun (un group excluant l'autre) ou plus probablement le bon résultat.
En fait, le group by en MySQL est pratique pour faire des limitations lors de jointures, mais sinon il vaut mieux passer par des distinct()

------------------------------ Réseau IRC Francophone | g33k-zone
Défiez-moi donc !
Répondre à crazycat@idn


Merci
J'ai testé mais et ça ne donne pas grand chose :d

Répondre à Blacko@IDN

tu veux quoi exactement? les rubriques des 50 derniers posts, c'est bien ça?

------------------------------ Réseau IRC Francophone | g33k-zone
Défiez-moi donc !
Répondre à crazycat@idn

et si tu nous donnais plus de code que la ligne sql, ca serait peut etre plus simple pour aider

Répondre à coca25

re désolé pour le retard ;)
En gros, dans cette page; http://www.soccers.fr/dernieres-discussions.php
qui, à l'aide dernier message posté sur le Forum, donne la liste des derniers sujets actifs; il y'a des sujets qui reviennent plusieurs fois (car plusieurs posts récents desus)
J'aimerais que ces sujets n'apparaissent qu'une seule fois.
Voici le code déjà utilisé qui donne tous les sujets des plus récents messages.

Code :
  1. $retour = mysql_query("SELECT * FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50" );
  2. while ($donnees = mysql_fetch_array($retour))
  3. {
  4. $posteur = $donnees['author_name'];
  5. $id_topic = $donnees['topic_id'];
  6. $retour2 = mysql_query("SELECT * FROM ipb_topics WHERE tid='$id_topic'" );
  7. while ($donnees = mysql_fetch_array($retour2))
  8. {
  9. $forum = $donnees['forum_id'];
  10. $titre = $donnees['title'];
  11. $retour3 = mysql_query("SELECT * FROM ipb_forums WHERE id='$forum'" );
  12. while ($donnees = mysql_fetch_array($retour3))
  13. {
  14. $nom_forum = $donnees['name'];


Répondre à Blacko@IDN

Citation :

re désolé pour le retard ;)



Oh c'est juste un retard de 1 an et 2 mois :D

Et si tu remplaçais :

Citation :

$retour = mysql_query("SELECT * FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50" );



Par

Citation :

$retour = mysql_query("SELECT author_name, distinct(topic_id) FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50" );

------------------------------ Les dessins des seins ou les desseins des saints ?
Répondre à OmaR

lol c'est vrai que ça date

Sinon, le distinct() cause une erreur mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

Répondre à Blacko@IDN

met un or die(mysql_error()); après le mysql_query() que l'on voit l'erreur

------------------------------ Les dessins des seins ou les desseins des saints ?
Répondre à OmaR

Hi
En fait le disticnt n'a aucun effet comme je l'avais déjà testé plusieurs fois auparavant
Je m'étais trompé de $retour quand j'ai remplacé hier (devait etre tard lol) :jap:

Code :
  1. $retour = mysql_query("SELECT * FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50" );
  2. while ($donnees = mysql_fetch_array($retour))
  3. {
  4. $posteur = $donnees['author_name'];
  5. $id_topic = $donnees['topic_id'];
  6. $retour2 = mysql_query("SELECT * FROM ipb_topics WHERE tid='$id_topic'" );
  7. while ($donnees = mysql_fetch_array($retour2))
  8. {
  9. $forum = $donnees['forum_id'];
  10. $titre = $donnees['title'];
  11. $retour3 = mysql_query("SELECT * FROM ipb_forums WHERE id='$forum'" );
  12. while ($donnees = mysql_fetch_array($retour3))
  13. {
  14. $nom_forum = $donnees['name'];


Je vois vraiment plus à ce niveau :heink:

Répondre à Blacko@IDN

Hmm... petite technique bourrine ?
On va tester ça :

 
Code :
  1. $retour = mysql_query("SELECT distinct(topic_id) topic_id FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50" );
  2. while ($donnees = mysql_fetch_array($retour))
  3. {
  4.     $id_topic = $donnees['topic_id'];
  5.     $retour1 = mysql_query("SELECT author_name FROM ipb_posts WHERE topic_id={$donnees['topic_id']} ORDER BY pid DESC LIMIT 1" );
  6.     $donnees1 = mysql_fetch_array($retour1);
  7.     $posteur = $donnees1['author_name'];
  8.     $retour2 = mysql_query("SELECT * FROM ipb_topics WHERE tid='$id_topic'" );
  9.     while ($donnees = mysql_fetch_array($retour2))
  10.     {
  11.         $forum = $donnees['forum_id'];
  12.         $titre = $donnees['title'];
  13.         $retour3 = mysql_query("SELECT * FROM ipb_forums WHERE id='$forum'" );
  14.         while ($donnees = mysql_fetch_array($retour3))
  15.         {
  16.             $nom_forum = $donnees['name'];
 

J'espère que j'ai pas oublié un truc... mais ça devrait le faire (oui c'est pas beau :D)


Message édité par OmaR le 22-08-2007 à 09:37:32
------------------------------ Les dessins des seins ou les desseins des saints ?
Répondre à OmaR

Apparemment c'est parfait, t'as raison j'suis bourrin sur le coup :d :d
Merci encore ;)

Répondre à Blacko@IDN
Tom's Guide > Forum > Programmation > Eviter la rédondence
Aller à :

Il y a 560 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens