Eviter la rédondence
Dernière réponse : dans Programmation
Bonjour
J'ai créé une page afin de lister les derniers sujets d'un Forum selon le message
Mais il arrive qu'un même sujet (pid) revienne plusieurs fois, comment éviter cette redondance de même donnée ?
Merci
J'ai créé une page afin de lister les derniers sujets d'un Forum selon le message
$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
Autres pages sur : eviter redondence
Lassé par la pub ? Créez un compte
Merci pour ta réponse
J'avais déjà essayé ça
Ca ne donne rien, des mêmes sujets reviennent plusieurs fois...
http://www.soccers.fr/dernieres-discussions.php
J'avais déjà essayé ça
$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
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
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
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
, 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
ok, après une brève recherche sur internet pour parfaire mon savoir
il s'avère que cette fonctionnalité est propre à mysql...
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!
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!
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()
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()
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.
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.
$retour = mysql_query("SELECT * FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50");
while ($donnees = mysql_fetch_array($retour))
{
$posteur = $donnees['author_name'];
$id_topic = $donnees['topic_id'];
$retour2 = mysql_query("SELECT * FROM ipb_topics WHERE tid='$id_topic'");
while ($donnees = mysql_fetch_array($retour2))
{
$forum = $donnees['forum_id'];
$titre = $donnees['title'];
$retour3 = mysql_query("SELECT * FROM ipb_forums WHERE id='$forum'");
while ($donnees = mysql_fetch_array($retour3))
{
$nom_forum = $donnees['name'];
Citation :
re désolé pour le retard
Oh c'est juste un retard de 1 an et 2 mois
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" );
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)
Je vois vraiment plus à ce niveau
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)
$retour = mysql_query("SELECT * FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50");
while ($donnees = mysql_fetch_array($retour))
{
$posteur = $donnees['author_name'];
$id_topic = $donnees['topic_id'];
$retour2 = mysql_query("SELECT * FROM ipb_topics WHERE tid='$id_topic'");
while ($donnees = mysql_fetch_array($retour2))
{
$forum = $donnees['forum_id'];
$titre = $donnees['title'];
$retour3 = mysql_query("SELECT * FROM ipb_forums WHERE id='$forum'");
while ($donnees = mysql_fetch_array($retour3))
{
$nom_forum = $donnees['name'];
Je vois vraiment plus à ce niveau
Hmm... petite technique bourrine ?
On va tester ça :
J'espère que j'ai pas oublié un truc... mais ça devrait le faire (oui c'est pas beau
)
On va tester ça :
$retour = mysql_query("SELECT distinct(topic_id) topic_id FROM ipb_posts ORDER BY pid DESC LIMIT 0, 50"); while ($donnees = mysql_fetch_array($retour)) { $id_topic = $donnees['topic_id']; $retour1 = mysql_query("SELECT author_name FROM ipb_posts WHERE topic_id={$donnees['topic_id']} ORDER BY pid DESC LIMIT 1"); $donnees1 = mysql_fetch_array($retour1); $posteur = $donnees1['author_name']; $retour2 = mysql_query("SELECT * FROM ipb_topics WHERE tid='$id_topic'"); while ($donnees = mysql_fetch_array($retour2)) { $forum = $donnees['forum_id']; $titre = $donnees['title']; $retour3 = mysql_query("SELECT * FROM ipb_forums WHERE id='$forum'"); while ($donnees = mysql_fetch_array($retour3)) { $nom_forum = $donnees['name'];
J'espère que j'ai pas oublié un truc... mais ça devrait le faire (oui c'est pas beau
) Lassé par la pub ? Créez un compte