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

Requêtes MySQL Discussion :

Utiliser MAX dans une jointure


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut Utiliser MAX dans une jointure
    Bonjour à tous.

    J'ai à ce jour une requête avec jointure sous la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
      p.id_product p,
      MAX(image_shop.`id_image`) id_image
    FROM 
       `ps_product`
    LEFT JOIN `ps_image` i ON (i.`id_product` = p.`id_product`)
    LEFT JOIN `ps_image_shop` image_shop ON (image_shop.id_image = i.id_image AND image_shop.id_shop = 2 AND image_shop.cover=1) 
    WHERE p.`id_product` = 10
    Maintenant j'aimerais ajouter un colone il.legend égal à MAX(image_shop.`id_image`) soit l'id_image déjà défini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
      p.id_product,
      MAX(image_shop.`id_image`) id_image, il.`legend` 
    FROM 
       `ps_product`
    LEFT JOIN `ps_image` i ON (i.`id_product` = p.`id_product`)
    LEFT JOIN `ps_image_shop` image_shop ON (image_shop.id_image = i.id_image AND image_shop.id_shop = 2 AND image_shop.cover=1) 
    LEFT JOIN `ps_image_lang` il ON (il.`id_image` = (MAX(image_shop.`id_image`))  AND il.`id_lang` = 5) 
    WHERE p.`id_product` = 10
    J'ai essayé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN `ps_image_lang` il ON (il.`id_image` = (MAX(image_shop.`id_image`))  AND il.`id_lang` = 5)
    ==>#1111 - Invalid use of group function


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT JOIN `ps_image_lang` il ON (il.`id_image` = `id_image`  AND il.`id_lang` = 5)
    ==> #1052 - Column 'id_image' in on clause is ambiguous

    Auriez-vous une idée?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Points : 301
    Points
    301
    Par défaut
    Bonsoir,

    Si tu remplaces ta fonction MAX par une sous requête dans la condition de jointure, cela devrait fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    LEFT JOIN `ps_image_lang` il ON (il.`id_image` = (SELECT MAX(image_shop.`id_image`) FROM ...)  AND il.`id_lang` = 5) 
    ...

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    387
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 387
    Points : 109
    Points
    109
    Par défaut merci mais
    Effectivement cela fonctionne, mais du coup je me retrouve avec une sous-requête comprenant la requête principale?

    Je pense que la construction n'est pas bonne.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Points : 301
    Points
    301
    Par défaut
    Par définition, c'est la sous requête qui est placée à l'intérieur de la requête principale.

    Je n'ai pas fait de tests, mais votre requête devrait ressembler à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 
      p.id_product p,
      MAX(image_shop.`id_image`) id_image
    FROM ps_product
      LEFT JOIN `ps_image` i 
              ON (i.`id_product` = p.`id_product`)
      LEFT JOIN `ps_image_shop` image_shop 
              ON (image_shop.id_image = i.id_image AND image_shop.id_shop = 2 AND image_shop.cover=1) 
      LEFT JOIN `ps_image_lang` il 
              ON (il.`id_image` = (SELECT MAX(psis.id_image) 
                                             FROM ps_image_shop psis) 
                   AND il.`id_lang` = 5) 
    WHERE p.`id_product` = 10
    Il faudrait aussi supprimer la fonction MAX() dans le SELECT je pense.

Discussions similaires

  1. ORDER BY, MAX() dans une jointure MySQL
    Par keusty78 dans le forum Requêtes
    Réponses: 20
    Dernier message: 10/09/2014, 16h56
  2. Utilisation de MAX() dans une boucle
    Par renaud26 dans le forum Langage
    Réponses: 5
    Dernier message: 21/04/2009, 15h32
  3. trouver une un MAX dans une jointure
    Par cmako dans le forum Langage SQL
    Réponses: 12
    Dernier message: 05/02/2009, 20h34
  4. Utiliser des ALIAS de colonnes dans une jointure
    Par mbzhackers dans le forum SQL
    Réponses: 4
    Dernier message: 31/03/2008, 10h27
  5. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38

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