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 05/01/2012, 10h21   #1
Membre habitué
 
Inscription : mai 2004
Messages : 383
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 383
Points : 129
Points : 129
Par défaut Select sur deux tables et left join

Bonjour,

Je n'arrive pas à faire une requête SQL qui doit récupérer des infos sur 2 tables avec un LEFT JOIN:

Code :
1
2
3
4
5
SELECT purchase.*, book.*  
FROM purchase, book 
LEFT JOIN purchase ON book.book_id = purchase.book_id 
WHERE purchase.user_id = 3 
ORDER BY purchase.purchase_date
J'ai réussi quand même le LEFT JOIN et celle-là fonctionne:
Code :
1
2
3
4
5
SELECT book.* 
FROM book 
LEFT JOIN purchase ON book.book_id = purchase.book_id 
WHERE purchase.user_id = 3 
ORDER BY purchase.purchase_date
Mais il me manque des infos qui sont dans la table purchase.

Comment je peux faire ?

merci,
Vincent.
defacta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 10h37   #2
Membre habitué
 
Inscription : mai 2004
Messages : 383
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 383
Points : 129
Points : 129
ok, c good !
Code :
1
2
3
4
5
6
 
SELECT book.*, purchase.* 
FROM book 
    LEFT JOIN purchase ON book.book_id = purchase.book_id 
WHERE purchase.user_id = 3 
ORDER BY purchase.purchase_date
defacta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 10h43   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
1) Puisque tu sais faire une jointure externe (LEFT JOIN), apprend à écrire correctement les jointures internes (INNER JOIN) selon la syntaxe en vigueur depuis 1992 !

2) Évite la guerre des étoiles !
Surtout entre deux tables qui ont des noms de colonnes identiques !

3) Tu mets une condition de restriction (WHERE) sur la table purchase qui est située à droite de la jointure externe à gauche. Tu transformes ainsi ta jointure externe en jointure interne !

Que cherches-tu exactement ?
- Tous les books et leurs infos de purchase quand elles existent ?
= > jointure externe
Code :
1
2
3
4
5
6
SELECT b.book_id, p.purchase_date
FROM book b
LEFT JOIN purchase p 
	ON b.book_id = p.book_id 
	AND p.user_id = 3 
ORDER BY p.purchase_date
- Seulement les books qui ont des infos dans purchase ?
=> Jointure interne
Code :
1
2
3
4
5
6
SELECT b.book_id, p.purchase_date
FROM book b
INNER JOIN purchase p 
	ON b.book_id = p.book_id 
WHERE p.user_id = 3 
ORDER BY p.purchase_date
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2012, 12h18   #4
Membre habitué
 
Inscription : mai 2004
Messages : 383
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 383
Points : 129
Points : 129
Citation:
Envoyé par CinePhil Voir le message
1) Puisque tu sais faire une jointure externe (LEFT JOIN), apprend à écrire correctement les jointures internes (INNER JOIN) selon la syntaxe en vigueur depuis 1992 !
Je ne connaissais pas inner join et j'ai fait quelque chose qui marchait avec left join...donc j'ai utilisé.
Et en fait il n'y a même pas besoin de INNER puisque le where va le faire automatiquement:
Code :
SELECT book.*, purchase.* FROM book, purchase WHERE book.book_id = purchase.book_id AND purchase.user_id = 3 ORDER BY purchase.purchase_date LIMIT 1000
Pour la guerre des étoiles, je suis bien d'accord mais pour les exemples je reste avec
defacta est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 05/01/2012, 13h31   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Disons que l'on promouvois les structures avec un inner join / left outer /etc car :
- c'est dans la norme SQL depuis plus de 20 ans
- ça permet une meilleur lisibiltié du code
- ça permet d'éviter des erreurs d'oublie de jointure sur des requêtes complexe
- c'est plus maintenable

Donc les jointures comme vous venez de le faire sont à proscrire
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 20
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h12.


 
 
 
 
Partenaires

Hébergement Web