Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels 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 13/04/2011, 17h38   #1
Candidat au titre de Membre du Club
 
Thomas
Développeur Web
Inscription : avril 2005
Messages : 29
Détails du profil
Informations personnelles :
Nom : Thomas
Âge : 27
Localisation : France, Vendée (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 29
Points : 14
Points : 14
Par défaut Liaison conditionnelle entre 2 tables

Bonjour,

Je ne suis pas sûr que mon titre soit très explicite mais voici mon problème :

2 tables
- client (id, nom, prenom)
- client_info (id_client, adresse, ville...)
(Il s'agit d'un exemple simplifiant la situation réelle)

Le but est de faire une recherche sur ces deux tables, du type :
Code :
1
2
3
SELECT * FROM client, client_info
WHERE client.id = client_info.client_id
AND (nom LIKE "%motclés%" OR adresse LIKE "%motclés%")
Jusque là rien de sorcier, mon problème interviens lorsque il n'existe pas d'enregistrement dans "client_info" correspondant à un enregistrement "client", la liaison
Code :
client.id = client_info.client_id
n'est plus respecté et même si il existe un client dont le nom correspond aux mots clés, l'enregistrement ne ressortira pas.

Ma question est donc la suivante :

Est-il possible de rendre optionnel la prise en compte de la liaison ?

J'ai essayé :
Code :
1
2
3
4
5
6
7
8
SELECT * FROM client, client_info
WHERE (
client.id = client_info.client_id OR 
NOT EXISTS(
SELECT client_id FROM client_info WHERE client_info.id = client.id
)
)
AND (nom LIKE "%motclés%" OR adresse LIKE "%motclés%")
Mais sans résultats.


Merci pour votre aide.


Thomas
tomaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 21h07   #2
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Bonsoir,

En utilisant le SQL normalisé, on peut faire ça avec la clause LEFT JOIN :
Code :
1
2
3
4
SELECT * 
FROM client 
LEFT JOIN client_info ON client.id = client_info.client_id
WHERE (nom LIKE "%motclés%" OR adresse LIKE "%motclés%")
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 21h15   #3
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Par défaut jointure externe

Bonjour,
Je vous invite à prendre quelques jours pour apprendre un peu plus sql, c'est nécessaire si vous voulez parfaitement maitriser le résultat recherché.
A moins de n'avoir rien compris, votre problème est très simple.

D'abord, je vous invite à oublier cette syntaxe pour les jointures et utiliser JOIN à la place (dernière norme sql).
Ensuite, lorsque vous voulez joindre deux tables, vous avez le choix d'indiquer au moteur de prendre (pour mysql) :
- soit toutes les lignes avec des valeurs communes aux deux tables (INNER JOIN)
- soit toutes les lignes de la table 1 et seulement les lignes de la table 2 pour lesquelles il y a une valeur commune (LEFT OUTER JOIN)
- soit toutes les lignes de la table 2 et seulement les lignes de la table 1 pour lesquelles il y a une valeur commune (RIGHT OUTER JOIN)
(sur d'autres bdd il y a aussi FULL JOIN ...)

Si je comprends bien votre modèle, la table client_info contient les données facultatives, donc vous devez modifier votre requête et l'écrire ainsi :
Code :
1
2
3
SELECT * FROM client t1
LEFT OUTER JOIN client_info t2 ON t2.client_id = t1.id
WHERE t1.nom LIKE "%motclés%" OR t2.adresse LIKE "%motclés%"
J'espère vous avoir aider, si vous avez le temps, regarder la rubrique "livres", ceux de "Christian Soutou" sont bien fait je trouve.

Bon courage
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 09h12   #4
Candidat au titre de Membre du Club
 
Thomas
Développeur Web
Inscription : avril 2005
Messages : 29
Détails du profil
Informations personnelles :
Nom : Thomas
Âge : 27
Localisation : France, Vendée (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 29
Points : 14
Points : 14
Merci à vous deux, c'est parfais.

patic je prends note de votre remarque Je vais d'ailleurs de ce pas regarder un peu le livre que vous me proposez !


Encore merci
tomaa 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 02h35.


 
 
 
 
Partenaires

Hébergement Web