Problème de jointure

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème de jointure

par momox » 18 janv. 2007, 08:15

AAAAAAAAhhhhh ok :D
Je viens de comprendre ^^

par Hubert Roksor » 18 janv. 2007, 00:27

Moi, tout ce que je vois c'est ça

Code : Tout sélectionner

membres as u LEFT OUTER JOIN sites as s ON n.news_site_id=s.site_id
:arrow: tu joins s à u en utilisant n. Ou si tu préfères, tu joins la porte au mur en utilisant l'évier comme jointure.

Ce n'est pas forcément ce qui cause l'erreur en question, mais c'est assurément quelque chose qu'il vaut mieux corriger. Donc revois ta requête pour lire "... n LEFT JOIN sites s ON ..."

par momox » 18 janv. 2007, 00:01

J'ai revu la requête de la facon suivante :

Code : Tout sélectionner

SELECT COUNT(n.news_id) as total_news, n.news_id, n.news_cat_id, n.news_site_id, n.news_auth_id, n.news_title, n.news_date, n.news_content, n.news_comment_status, nc.cat_id, nc.cat_name, u.user_nick FROM news as n, news_categories as nc, membres as u LEFT OUTER JOIN sites as s ON n.news_site_id=s.site_id WHERE n.news_trashed='0' AND n.news_cat_id=nc.cat_id AND n.news_auth_id=u.user_id GROUP BY n.news_id ORDER BY news_id DESC LIMIT 0, 20;
nc => news_categories
n => news
s => sites
Donc seulement trois tables sont utilisées.
Si j'enleve ce left outer join et bien sur, hop, la requête marche...
Seulement, news_site_id fait partie de la table news, qui est référencée en tant que n, or, mysql me renvoie une erreur concernant l'absence de de champ dans la table news mais ce champ m'est correctement renvoyé si j'enleve la clause LEFT OUTER JOIN...
:-k
C'est quand même assez bizarre je dois avouer...
Dans mes précédentes requetes SQL ou LEFT OUTER JOIN était utilisé, l'utilisation de ce type de jointure était tout a fait identique...

par Hubert Roksor » 17 janv. 2007, 23:37

Ok, je vais essayer mes dons de divination, le message d'erreur est "Unknown column 'n.news_site_id' in 'on clause'" donc MySQL ne sait pas qui est "n.news_site_id", je regarde la requête et je vois que tu y fais référence pour la jointure de deux autres tables. Tu joins c à s en utilisant n comme condition de jointure, j'imagine que MySQL ne comprend pas.

Réordonne tes tables pour faire la jointure entre les bonnes, en l'occurence n et s, pas c et s. En cas d'échec, poste ta nouvelle requête et le message d'erreur correspondant.

par momox » 17 janv. 2007, 22:36

J'ai tenté de réecire la requête SQL, même résultat...
C'est a ne plus rien y comprendre...

par momox » 17 janv. 2007, 21:48

C'est quand même bizarre, que du jour au lendemain, la requete ne fonctionne plus non ?

par albat » 17 janv. 2007, 21:06

Pour utiliser des alias, il me semble qu'il faut utiliser

Code : Tout sélectionner

FROM table t
au lieu de

Code : Tout sélectionner

FROM table as t
En SQL, les deux écritures sont valables.
Ensuite, chaque moteur (MySQL, Oracle, ...) peut avoir ses petites préférences.

Pour ma part, j'utilise le AS pour donner un alias à un champ
et je n'en mets pas pour donner un alias à une table.

Les alias de champs ressemblant souvent à un nom de champ, les AS sont utiles.
En revanche, les alias de tables ne faisant généralement qu'une lettre, les AS n'apportent rien.
Question de lisibilité, donc.
SELECT count(T.champ) AS total FROM table T 
Et je n'ai jamais rencontré de problèmes, sous quelque moteur de SGBD que ce soit. ;)

par momox » 17 janv. 2007, 20:54

Non, ca fonctionne parfaitement.
En enlevant la clause LEFT OUTER JOIN ON, ca fonctionne nickel, mis a part que le nom du site ne peut s'afficher.

par zeus » 17 janv. 2007, 16:44

C'est pas au niveau du JOIN, mais au niveau du FROM

Pour utiliser des alias, il me semble qu'il faut utiliser

Code : Tout sélectionner

FROM table t
au lieu de

Code : Tout sélectionner

FROM table as t

Problème de jointure

par momox » 17 janv. 2007, 15:41

Bonjour,
afin de selctionner toutes les news de mon site, j'ai fait la requête suivante, qui fonctionnait jusqu'a la mise en place de Mysql 5 hier soir...
Sur la requête suivante :

Code : Tout sélectionner

SELECT COUNT(nc.news_id) as total_news, n.news_id, n.news_cat_id, n.news_status, n.news_comment_status, n.news_title, n.news_date, c.cat_name, s.site_name, n.news_site_id FROM news as nc, news as n, news_categories as c LEFT JOIN sites as s ON n.news_site_id=s.site_id WHERE n.news_cat_id=c.cat_id AND n.news_trashed='0' AND nc.news_trashed='0' GROUP BY n.news_id LIMIT 0, 20;
mysql me retourne l'erreur suivante :
Erreur SQL ! :
Unknown column 'n.news_site_id' in 'on clause'
SELECT COUNT(nc.news_id) as total_news, n.news_id, n.news_cat_id, n.news_status, n.news_comment_status, n.news_title, n.news_date, c.cat_name, s.site_name, n.news_site_id
FROM news as nc, news as n, news_categories as c LEFT OUTER JOIN sites as s ON n.news_site_id=s.site_id
WHERE n.news_cat_id=c.cat_id AND n.news_trashed='0' AND nc.news_trashed='0'
GROUP BY n.news_id
LIMIT 0, 20;
Pourtant, il ne renvoie pas d'erreur quand je selectionne n.news_site_id dans la clause SELECT.
Y a t'il des changements au niveau des requetes LEFT OUTER JOIN dans mysql 5 ?
Merci d'avance ;)