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 03/01/2011, 15h36   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 1
Points : 1
Par défaut JOIN + ORDER sur la seconde table

Bonjour à tous,

Voici mon problème en MySQL :

Une première table liste des séries de photos (id_serie, libelle, tri_serie)
Une deuxième table liste les photos (id_serie, filename, tri_photos)

J'aimerais lister les séries dans l'ordre tri_serie, avec, pour illustrer chaque serie, la première photo s'y rattachant (la première étant identifiée par le champ tri_photos).

Exemple :
Table series (id_serie, libelle, tri_serie) :
1 : Couchers de soleil : 2
2 : Natures mortes : 3
3 : Paysages : 4
4 : Noir et Blanc : 1

Table photos (id_serie, filename, tri_photos) :
1 : tahiti.jpg : 2
2 : pomme.jpg : 4
1 : hawai.jpg : 1
3 : plage.jpg : 3


J'ai essayé :
Code :
1
2
3
4
5
6
 
SELECT series.libelle, photos.filename
FROM series
LEFT JOIN photos ON photos.serie_id = series.id
GROUP BY series.libelle
ORDER BY series.tri_serie
Résultat obtenu :
1 : Noir et Blanc : NULL
2 : Couchers de soleil : tahiti.jpg
3 : Natures mortes : pomme.jpg
4 : Paysages : plage.jpg


Résultat souhaité :
1 : Noir et Blanc : NULL
2 : Couchers de soleil : hawai.jpg
3 : Natures mortes : pomme.jpg
4 : Paysages : plage.jpg


J'ai essayé des tas d'autres combinaisons que la décence m'interdit de reproduire ici !

Pouvez-vous m'aider avant que je ne devienne fou ?
masterfab94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 15h47   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bonjour,


Comment sont générés les nombres de la colonne tri_photo dans la table "Table photos" ?

Y-a-t-il des doublons possible dessus ?

Comment choisissez-vous cette "1ere" photo ? est-ce une photo au hasard ou la retrouve-t-on avec un critère précis ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 15h55   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
En rajoutant le critère tri_photos dans la condition de jointure ça devrait répondre à ton besoin:
Code :
1
2
3
4
SELECT s.libelle, p.filename
FROM series s
LEFT JOIN photos p ON p.serie_id = s.id_serie AND p.tri_photos = 1
ORDER BY s.tri_serie
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 15h55   #4
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 1
Points : 1
Bonjour,

Le champ tri_photos est séquentiel (donc sans doublon normalement), et est généré par un outil en Ajax qui réordonne les photos selon les besoins de l'administrateur.
masterfab94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 15h56   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
Envoyé par skuatamad Voir le message
En rajoutant le critère tri_photos dans la condition de jointure ça devrait répondre à ton besoin:
Code :
1
2
3
4
SELECT s.libelle, p.filename
FROM series s
LEFT JOIN photos p ON p.serie_id = s.id_serie AND p.tri_photos = 1
ORDER BY s.tri_serie
marchera pas, tri_photo est au mieux un nombre auto-incrémenté.

Il ne commence pas à 1 à toutes les séries, d'où mes questions précédentes.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 16h00   #6
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 1
Points : 1
Ben non, ça ne fonctionne pas skuatamad.

J'obtiens :

1 : Noir et Blanc : NULL
2 : Couchers de soleil : hawai.jpg
3 : Natures mortes : NULL
4 : Paysages : NULL
masterfab94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 16h10   #7
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
Bonjour,


Le champ tri_photos est séquentiel (donc sans doublon normalement), et est généré par un outil en Ajax qui réordonne les photos selon les besoins de l'administrateur.
Dans ce cas il faut faire un LEFT OUTER JOIN sur une sous-requete, ce qui n'est pas performant sous mysql.

Si c'est trop lent il faudra voir pour une autre solution :

Code :
1
2
3
4
5
6
7
8
 
SELECT c.libelle, d.filename
FROM series c
LEFT OUTER JOIN 
	(SELECT a.id_serie, a.filename
	FROM photos a
	INNER JOIN (SELECT id_serie, min(tri_photos) AS tri_photos FROM photos GROUP BY id_serie) b ON 
		a.id_serie = b.id_serie AND a.tri_photos = b.tri_photos) d ON c.id_serie = d.id_serie
J'espère que la syntaxe passera sous MySql.

resulta obtenu :
Citation:
Couchers hawai
Natures pomme
Paysages plage
Noir et null
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 16h21   #8
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 1
Points : 1
C'est déjà bien mieux que ce que j'obtenais.
Merci punkoff.

Mais j'aimerais, qu'en plus, le tout soit trié selon tri_serie.

C'est curieux comme l'énoncé semble super simple et la réalisation si complexe !
masterfab94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 16h25   #9
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Citation:
C'est curieux comme l'énoncé semble super simple et la réalisation si complexe !
Oui c'est ce que je me disais.
Si je trouve plus simple je posterai une autre solution (ou quelqu'un d'autre plus alaise avec MySql le fera).

Citation:
Mais j'aimerais, qu'en plus, le tout soit trié selon tri_serie.
Remettez un order by à la fin de la requête.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 16h28   #10
Modérateur
 
Inscription : octobre 2008
Messages : 1 504
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 504
Points : 2 033
Points : 2 033
Pourquoi il y aurait un LEFT JOIN ici au lieu d'un simple JOIN? L'énoncé du problème qui dit "la première photo s'y rattachant" semble plutôt impliquer qu'on n'affiche pas une série qui n'aurait aucune photo (à supposer que ça existe).

Sinon le principe d'aller chercher le MIN(tri_photos) par série, et ensuite de joindre une nouvelle fois avec photo pour retrouver le nom de fichier correspondant est effectivement une bonne solution pour ce problème, qui devrait fonctionner avec mysql ou n'importe quoi d'autre qui permette les sous-requêtes.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 16h31   #11
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 1
Points : 1
Si si, on doit afficher une série qui n'aurait aucune photo :

Résultat souhaité :
1 : Noir et Blanc : NULL
2 : Couchers de soleil : hawai.jpg
3 : Natures mortes : pomme.jpg
4 : Paysages : plage.jpg
masterfab94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 16h31   #12
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Car dans l'énoncé il stipule :

Citation:
Résultat souhaité :
1 : Noir et Blanc : NULL
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2011, 19h16   #13
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
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 : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Essaie cette requête :
Code :
1
2
3
4
5
6
7
8
9
10
SELECT tmp.id_serie, tmp.libelle, ph.filename
FROM 
(
	SELECT s.id_serie, s.libelle, s.tri_serie, MIN(p.tri_photo) AS premiere_photo
	FROM series AS s
	LEFT OUTER JOIN photos AS p ON p.id_serie = s.id_serie
	GROUP BY s.id_serie, s.libelle, s.tri_serie
) AS tmp
LEFT OUTER JOIN photos AS ph ON ph.tri_photo = tmp.premiere_photo
ORDER BY tmp.tri_serie
__________________
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 04/01/2011, 09h11   #14
Invité de passage
 
Inscription : janvier 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 6
Points : 1
Points : 1
Ca marche super bien !

Merci beaucoup CinePhil et punkoff !

Je ne m'attendais pas à ce que la requête soit si complexe et je comprends mieux maintenant pourquoi je calais. Quelque part, c'est rassurant !
masterfab94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 09h32   #15
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 980
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 : 10 980
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
Elle n'est pas si complexe que ça !
La sous-requête cherche la référence de la première photo de chaque série et la sur-requête récupère son filename.
__________________
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h09.


 
 
 
 
Partenaires

Hébergement Web