Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 19/01/2012, 22h57   #1
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Par défaut Jointure entre trois tables

Bonsoir,
J'ai trois tables sql, la première , 'appartements' la deuxième 'maison' et la troisième 'transactions' A vendre et A louer.
La table appartements et la table maisons contiennent toutes les deux une clé étrangère 'transactionID', si l'appartement ou la maison est à vendre transactionID = 1, si c'est à louer transactionID=2.
je voudrais faire une jointure entre elles, pour avoir dans un même tableau tous les appartements et maisosn qui sont à vendre si la condition de la requête transactionID=1 et pareille tous les appartements et maisons qui sont à louer si transactionID=2.
Voilà la requête que j'ai testé et qui ne marche pas:

Code :
1
2
3
4
5
SELECT appartements.Reference, maisons.Reference, transactions.ID
  FROM appartements, maisons, transactions
 WHERE appartements.transactionID = transactions.ID
   AND maisons.transactionID = transactions.ID
   AND transactions.ID = 1
Merci pour votre aide.
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 06h37   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 922
Points : 1 922
Bonjour,
Ta requête ne fonctionne que si tu as aumoins une maison ET au moins un appartement à vendre... De plus, si tu as 3 maisons et 5 appartements, elle te renvoie 15 lignes (les 15 combinaisons possibles).

Je pense qu'il te faut une union de 2 requêtes, une qui renvoie les maisons, et l'autre les appartements.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 20/01/2012, 09h18   #3
Invité régulier
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Vienne (Poitou Charente)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 7
Points : 7
Salut, moi je ferai ça :
Code :
1
2
3
4
5
6
 
SELECT appartements.Reference, maisons.Reference, transactions.ID
  FROM appartements, maisons, transactions
 WHERE appartements.transactionID = transaction.transactions.ID
   AND maisons.transactionID = transaction.transactions.ID
   AND transactions.ID = 1
Voila, je sais pas si c'est complètement juste mais moi, c'est ce que je ferai en tout cas
Heallidan est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/01/2012, 09h59   #4
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 922
Points : 1 922
Même problème que la requête d'origine, et surtout je ne vois pas trop l'intérêt de spécifier le schéma/la base pour la table transactions...

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 10h46   #5
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
En passant ce n'est plus la norme utilisée pour les jointures !!
A moins que son SGBD ne supporte pas les JOIN, mais on ne peut pas savoir car nous ne le connaissons pas.

Les left outer join pourront régler ton problème :

Code :
1
2
3
4
5
6
7
8
 SELECT ID, a.reference, m.reference
 
FROM transaction t
      LEFT OUTER JOIN appartements a
      ON a.transactionID = t.ID
 
      LEFT OUTER JOIN maison m
      ON m.transactionID = t.ID
Il faut rajouter tes conditions.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/01/2012, 17h11   #6
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Merci, pour vos réponses, je vais tester tous ça et revenir vous dire qu'est-ce qu'il en est.
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 17h13   #7
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Il semble en outre y avoir confusion entre deux colonnes de la table transactions, vu qu'il n'y a que "transaction.ID" dans votre requête :
- Celle qui détermine l'ID de la transaction à proprement parler, et qui permet semble-t-il de faire jointure avec maison et appartement.
- Celle qui détermine la catégorie de la transaction.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/01/2012, 19h23   #8
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Après avoir tester ce code:

Code :
1
2
3
4
5
6
7
8
9
10
SELECT ID, a.reference, m.reference
 
FROM transactions t
      LEFT OUTER JOIN appartements a
      ON a.transactionID = t.ID
 
      LEFT OUTER JOIN maisons m
      ON m.transactionID = t.ID
 
WHERE t.ID = 1
J'obtient une table avec deux colonnes réference pour chaque type de bien, les enregistrements se répète!!
Pour afficher tous les biens à vendre dans la même page, il ne faut pas que les références des deux types de biens soient dans la même colonne..????
Merci pour vos réponses
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 21h36   #9
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 922
Points : 1 922
Si tu veux les appartements et les maisons sur la même colonne, il faut utiliser une union:
Code SQL :
1
2
3
4
5
6
7
8
9
10
 
SELECT t.id,a.id
FROM transactions t
INNER JOIN appartement a ON a.transactionid = t.id
WHERE t.id = 1
union ALL
SELECT t.id,m.id
FROM transactions t
INNER JOIN maison m ON m.transactionid = t.id
WHERE t.id = 1

Pour ta deuxième question, difficile de répondre, ça dépend du code de la page en question.

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 22h09   #10
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Merci pour ta réponse tatayo, je vais tester tous ça!
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/01/2012, 23h23   #11
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Voilà le code après une petite adaptation, J'ai pu avoir tous les appartements et maisons qui son à vendre sur la même page.

Code :
1
2
3
4
5
6
7
8
9
10
 
SELECT t.ID, a.Reference
FROM transactions t
INNER JOIN appartements a ON a.transactionID = t.ID
WHERE t.ID =1
UNION ALL 
SELECT t.ID, m.Reference
FROM transactions t
INNER JOIN maisons m ON m.transactionID = t.ID
WHERE t.ID =1
Je vais travailler à présent sur le formulaire de recherche multicritères, toujours en piochant les infos de 3 tables.
Merci encore une fois à toutes et à tous qui mon aidé à résoudre ce problème.
A bientôt!!!
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 14h48   #12
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
En supposant qu'il y ait bien une Foreign Key, quel est l'intérêt d'avoir la table Transactions si on n'y met aucun filtre et qu'on n'en prend aucun champ ?

Code :
1
2
3
4
5
6
7
8
 
SELECT a.transactionID , a.Reference
FROM appartements a
WHERE a.transactionID =1
UNION ALL 
SELECT m.transactionID , m.Reference
FROM maisons m 
WHERE m.transactionID  =1
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 26/01/2012, 13h38   #13
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Ok, comme je suis toujours en quête d'apprentissage, je vais tester ce code.
Merci
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 20h09   #14
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Châpeau! j'obtiens le même résultat sans faire recours à la table transactions.
Merci
bili31 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 02h48.


 
 
 
 
Partenaires

Hébergement Web