Page 1 sur 1

Problème de requete pour mes news.

Posté : 12 oct. 2006, 20:49
par momox
Bonsoir,
afin d'afficher les news de mon site, j'ai concocté une petite requête qui est la suivante:

Code : Tout sélectionner

SELECT news_id, news_cat_id, news_auth_id, news_title, news_date, news_last_edit, news_content, cat_id, cat_name, COUNT(comment_id) as nbre_comment FROM news as n, news_categories as ncat, news_comment as ncom WHERE n.news_id=ncom.comment_news_id AND ncat.cat_id=n.news_cat_id AND news_status='1' GROUP BY comment_id ORDER BY news_date ASC
Elle me permet de selectionner le nom de la catégorie de la news ainsi que de compter le nombre de commentaires.
Mais je suis confronté a un problème avec la structure actuelle de la requête.
Si je n'ai aucun commentaire, la news ne s'affiche pas.
Donc je suis confronté a ce leger bug...
Y a t'il un moyen de faire en sorte que même si il n'y a pas de commentaires, la news soit quand même affichée?
Dois-je laisse une sorte de tracker pour chaque news?

Posté : 12 oct. 2006, 21:44
par Ajoloca
Bonsoir,

Regarde du coté de LEFT JOIN

Posté : 12 oct. 2006, 21:47
par Cyrano
Oui, c'est possible, mais il faut dans ce cas faire ce qu'on appelle une jointure externe : me basant sur l'impression que ça me donne, j'ai des raisons de croire que la table news_comment est reliée à la table news. Ça va donc donner quelque chose dans ce style là :

Code : Tout sélectionner

SELECT news_id, news_cat_id, news_auth_id, news_title, news_date, news_last_edit, news_content, cat_id, cat_name, COUNT(comment_id) as nbre_comment FROM news_categories as ncat, news as n LEFT OUTER JOIN news_comment as ncom ON n.news_id = ncom.comment_news_id WHERE ncat.cat_id = n.news_cat_id AND news_status='1' GROUP BY news_id ORDER BY news_date ASC;
J'ai modifié le champ de la clause GROUP BY puisque le COUNT est sur un champ de la table news_comment, il faut grouper sur un champ d'une autre table et ici en l'occurence sur l'identifiant des news, ça me semble plus approprié. À tester.

Si c'est pas bon, donne la structure des tables qu'on sache ce qui est relié à quoi dans quel sens.

Posté : 12 oct. 2006, 22:42
par momox
Voila a quoi ressemble la table actuelle.
Image
Ensuite, voici la requête corrigée car j'avais oublié la selection d'utilisateur

Code : Tout sélectionner

SELECT news_id, news_cat_id, news_auth_id, news_title, news_date, news_last_edit, news_content, cat_id, cat_name, COUNT(comment_id) as nbre_comment, user_nick, user_id FROM news as n, news_categories as ncat, membres as u LEFT OUTER JOIN news_comment as ncom ON n.news_id=ncom.comment_news_id WHERE n.news_auth_id=u.user_id AND ncat.cat_id=n.news_cat_id AND news_status='1' AND u.user_active='1' GROUP BY news_id ORDER BY news_date ASC
Je viens justement de tester la requete dans MYSQL Query Browser et il m'a retourné l'erreur suivante:

Code : Tout sélectionner

Unknown column 'n.news_id' in 'on clause'
@+ et merci d'avance :)

Posté : 13 oct. 2006, 07:51
par Cyrano
Forcément que la colonne est inconnue :

Lorsque on utilise JOIN, il faut savoir que la jointure va se faire entre la table qui précède "JOIN" et celle qui suit. Donc dans ta requête, la jointure se fait entre membres et news_comment : aucune de ces deux table ne comporte de colonne news_id.

Donc il faut placer la table news juste avant le JOIN, soit comme ceci :

Code : Tout sélectionner

SELECT news_id, news_cat_id, news_auth_id, news_title, news_date, news_last_edit, news_content, cat_id, cat_name, COUNT(comment_id) as nbre_comment, user_nick, user_id FROM news_categories as ncat, membres as u, news as n LEFT OUTER JOIN news_comment as ncom ON n.news_id=ncom.comment_news_id WHERE n.news_auth_id=u.user_id AND ncat.cat_id=n.news_cat_id AND news_status='1' AND u.user_active='1' GROUP BY news_id ORDER BY news_date ASC;
Soit comme cela :

Code : Tout sélectionner

SELECT news_id, news_cat_id, news_auth_id, news_title, news_date, news_last_edit, news_content, cat_id, cat_name, COUNT(comment_id) as nbre_comment, user_nick, user_id FROM news as n LEFT OUTER JOIN news_comment as ncom ON n.news_id=ncom.comment_news_id, news_categories as ncat, membres as u WHERE n.news_auth_id=u.user_id AND ncat.cat_id=n.news_cat_id AND news_status='1' AND u.user_active='1' GROUP BY news_id ORDER BY news_date ASC;
Attention à la seconde possibilité à ne pas oublier la virgule qui termine la clause "ON" indiquant que d'autres noms de tables suivent.

Posté : 13 oct. 2006, 07:53
par momox
Merci Cyrano, j'irais au lycée moins bête aujourd'hui :lol:
@+

Posté : 13 oct. 2006, 19:49
par momox
Tiens au passage, j'ai enlevé le résolu, car un autre problème m'est apparu... :/
Comment faire pour que la requete me compte toutes mes news d'un seul coup?
@+ et merci d'avance ;)

Posté : 13 oct. 2006, 20:04
par Cyrano
Ta question me semble incomplète : "toutes" celles que retourne la requête actuelle ou bien "toutes" incluant celles qui ne sont pas retournées ?

Dans le premier cas, tu as mysql_num_rows() qui va te donner ça.

Dans le second cas, ça va poser un problème mais ce n'est pas infaisable, encore que ça dépende des critères de tri que tu veux obtenir.

Posté : 13 oct. 2006, 20:06
par momox
Il faut juste que je compte toutes les news de la table afin de generer la pagination...
@+

Posté : 13 oct. 2006, 20:17
par Cyrano
Je reformule pour que tu saisisse encore mieux que tu as toujours mal formulé ta question : La requête que nous avons corrigé va retourner un certain nombre de lignes : peut-être plus que ce que tu voudrais afficher.

Tu as deux possibilités :
-1- Commencer par effectuer un COUNT() sans récupérer de données, juste le nombre : coment ? Avec la même requête à ce détail près que tu remplaces tous les champs de la clause SELECT par un simple COUNT(news_id), et tu peux virer les clauses GROUP BY et ORDER BY mais tu gardes les jointures telles quelles.
Ensuite lorsque tu as le nombre, tu peux refaire la requête d'origine en lui ajoutant une clause LIMIT

-2- Effectuer la requête telle-quelle et stocker les données dans un tableau indexé, compter le nombre de lignes soit avec mysql_num_rows() soit avec count() sur ton tableau et ensuite afficher en bouclant sur le tableau en mettant des contrôles pour compter le point de départ et le point d'arrêt. Moins pratique.

MAIS... ça veut donc dire si c'est bien ce que tu veux faire que le "toutes" concernes les lignes retournées par ta requête" et non "toutes" incluant les autres.

Posté : 13 oct. 2006, 20:26
par momox
J'ai vérifié la requête, toutes les valeurs sont utilisées, rien de superflu :)
Ce dont j'ai besoin en l'occurence, c'est de comptabiliser le nombre d'enregistrements dans la table news afin de generer la pagination qui necessite le nombre d'enregistrements dans la table.
@+

Posté : 13 oct. 2006, 20:31
par Cyrano
Bon, alors je vais reformuler la question parce que décidément, j'ai l'impression qu'on est pas sur la même longueur d'ondes :
Tu as dans ta base de données un nombre X de news;
Ta requête va retourner un nombre Y de lignes;
X est peut-être différent de Y : mais tu veux obtenir X ou Y ?

Si c'est bien Y que tu veux, alors reprends ma précédente réponse.

Posté : 13 oct. 2006, 21:46
par momox
Ben c'est Y justement, qui correspond au nombre d'enregistrements dans la table news, comme précisé dans mon message précédent. :?
@+ ;)