IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

JOIN + ORDER sur la seconde table


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 6
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    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 ?

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    En rajoutant le critère tri_photos dans la condition de jointure ça devrait répondre à ton besoin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 6
    Par défaut
    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.

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 6
    Par défaut
    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

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Couchers hawai
    Natures pomme
    Paysages plage
    Noir et null

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 6
    Par défaut
    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 !

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 12/08/2008, 17h10
  2. Double OUTER JOIN sur la meme table?
    Par nabab dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/01/2008, 18h48
  3. 2 LEFT JOIN sur une même table
    Par dakan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/10/2007, 13h51
  4. 3 Inner Join sur la même table
    Par Zolex dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/05/2007, 12h32
  5. left join multiple sur grosses tables
    Par hn2k5 dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/11/2005, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo