Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 02/12/2011, 19h36   #1
Invité de passage
 
En réorientation professionnelle
Inscription : juin 2011
Messages : 4
Détails du profil
Informations professionnelles :
Activité : En réorientation professionnelle

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 2
Points : 2
Par défaut requête sur plueieurs tables

Bonjour !

Voilà une journée que je m'arrache les cheveux, je crois que je n'ai pas bien compris le principe des jointures, sur ce coup-là.
Si quelqu'un avait la gentillesse de m'aider ?

J'apprends, je suis novice en MySQL... Clémence je vous en prie !

Voilà mon problème.

Je souhaite afficher une série d'articles et les informations s'y rapportant. Les informations qui concernent ces articles sont réparties sur plusieurs tables.

Je veux afficher titre, contenu, nom auteur, prenom auteur, date, thème, catégorie.

Les champs titre, contenu et date sont sur la table news, laquelle a aussi un id_auteur, et un id_news bien entendu.

Dans une table membre, j'ai le nom et prenom de l'auteur.
Dans une table news_cat , j'ai l'id_news ainsi que l'id_cat, car dans categorie, j'ai l'id_cat et le nom_categorie ...
Même principe pour theme :
table theme : id_theme, nom_theme
table news_theme : id_news, id_theme

Je suis pas si je suis très claire.

Très sagement, j'ai écrit cette requête là :
Citation:
SELECT
news.id_news,
news_cat.id_categorie,
news_theme.id_theme,
news.titre,
news.contenu,
news.id_auteur,
membre.nom,
membre.prenom,
news.date,
categorie.nom_categorie ,
theme.nom_theme
FROM news, membre, categorie, news_cat, news_theme, theme
WHERE membre.id_membre = news.id_auteur
&& categorie.id_categorie = news_cat.id_categorie
&& theme.id_theme = news_theme.id_theme
ORDER BY id_news DESC limit 10
qui BIEN ENTENDU me renvoie 10 résultats identiques...
Si je mettais pas de limite elle m'en renverrait à l'infini...

Mais je n'arrive pas à comprendre quelle technique je dois employer pour la jointure...
LEFT JOIN ?
un autre SELECT imbriqué ???
Une meilleure clause dans WHERE ???

J'ai lu des pages et des pages... Et là, j'ai la cervelle en surchauffe... Je répète : je débute... :s
Est-ce qu'une bonne âme pourrait m'aiguiller vers la solution siouplaît ?
progcyb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 20h29   #2
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 881
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 881
Points : 7 660
Points : 7 660
Déjà pour commencer, je sais que c'est ce qui est enseigné dans les écoles, mais je te conseille de bannir définitivement de tes méthodes, les jointures dites implicites :
Code :
1
2
3
4
FROM news, membre, categorie, news_cat, news_theme, theme
WHERE membre.id_membre = news.id_auteur
&& categorie.id_categorie = news_cat.id_categorie
&& theme.id_theme = news_theme.id_theme
C'est une source de bugs bien cachés et souvent pas évident à trouver.

Une jointure devrait s'écrire toujours explicitement. Une jointure implicite se remplace par une jointure interne (INNER JOIN) :
Code :
1
2
3
4
5
6
FROM news 
INNER JOIN membre ON news.id_auteur=membre.id_auteur
INNER JOIN news_cat ON ???? --> problème, lien non défini avec news
INNER JOIN categorie ON categorie.id_categorie = news_cat.id_categorie
INNER JOIN news_theme ON ??? --> problème, lien non défini avec news
INNER JOIN theme ON theme.id_theme = news_theme.id_theme
Le Where sert à filtrer les resultats obtenu et ne devrait pas servir à faire les jointures. C'est une érésie.

Je ne sais pas pour MySQL, mais j'imagine que c'est comme les autres SGBD, le "Et" s'écrit AND et non pas &&
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 21h08   #3
Invité de passage
 
En réorientation professionnelle
Inscription : juin 2011
Messages : 4
Détails du profil
Informations professionnelles :
Activité : En réorientation professionnelle

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 2
Points : 2
d'habitude, je mets effectivement AND, mais && passe aussi sur mysql en tout cas mais je vais suivre les deux conseils. (j'suis autodidacte, j'ai de mauvaises habitudes que je ne demande qu'à corriger merci !)
Et je sens que là, j'ai de sacrées lacunes en mysql... :s

Effectivement, ce qui est délicat, c'est que la table categorie et theme ont des id_categorie et id_theme qui sont non pas dans news, mais dans une table de lien à chaque fois : news_cat et theme_cat.

Je me rends bien compte que ma requête ne marche pas et je vois que c'est stupide ce que je fais...
Mais je ne sais tout bonnement pas comment faire pour relier toutes les tables en une requête,
je sais pas si c'est possible en fait... J'imagine que oui ?!

J'ai déjà vu qu'on pouvait inclure des select dans un select, mais là, je ne vois pas non plus si c'est vers cette solution que je dois me tourner.

Je vais essayer en repartant de la proposition faite dans un premier temps, merci pour les conseils !!

thooooo je pense que j'aurais dû mettre ça chez les nioubs débutants !! J'suis désoléééééée :s
progcyb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 22h19   #4
Modérateur
 
Avatar de sevyc64
 
Homme Yves
Développeur informatique
Inscription : janvier 2007
Messages : 3 881
Détails du profil
Informations personnelles :
Nom : Homme Yves
Âge : 39
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2007
Messages : 3 881
Points : 7 660
Points : 7 660
Dans la correction que je t'ai donné, il te manque le lien entre news_cat et news et entre news_theme et news.

Si tu as compris les modifications que j'ai faites, tu devrais pouvoir retrouver ces liens manquant.

Dans news_cat, par exemple, tu dois avoir un id_news et un id_categorie. Le id_catégorie est branché à la table categorie dans la jointure. Il te reste à relier à la table news par le id_news (si c'est bien lui).

Si, après ça, ça marche pas explique plus en détail ton problème
__________________
Sevyc64 --- Le partage est notre force

NON AU LANGAGE SMS & FAUTES VOLONTAIRES SUR LES FORUMS
sevyc64 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/12/2011, 07h39   #5
Invité de passage
 
En réorientation professionnelle
Inscription : juin 2011
Messages : 4
Détails du profil
Informations professionnelles :
Activité : En réorientation professionnelle

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 2
Points : 2
Oui, je vais essayer de trouver à partir de là,

et je reviens signaler si j'y arrive pas, ou si j'ai enfin trouvé...
Dans tous les cas, ton aide m'est déjà très précieuse, merci infiniment.
(et oui, c'est exactement comme ça que le lien est fait.)

-> va tester quelques idées de suite...

edit : Ca marche !! Merci beaucoup beaucoup beaucoup, j'ai compris !!

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT news.titre, 
news.contenu,
news.date,
membre.nom,
membre.prenom,
membre.autorisation,
categorie.nom_categorie,
theme.nom_theme FROM news
 
INNER JOIN membre ON news.id_auteur=membre.id_membre
 
INNER JOIN categorie ON (SELECT id_categorie
FROM news_cat
WHERE news_cat.id_news = news.id_news)=id_categorie 
 
INNER JOIN theme ON (SELECT id_theme
FROM news_theme
WHERE news_theme.id_news = news.id_news)=id_theme
;
enfin cette fois-ci j'espère que la syntaxe n'est pas trop crado ?! :s
progcyb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h57.


 
 
 
 
Partenaires

Hébergement Web