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

MySQL Discussion :

Requête complexe avec LEFT JOIN compliqué


Sujet :

MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable des études
    Inscrit en
    Janvier 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2017
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Requête complexe avec LEFT JOIN compliqué
    Bonjour

    voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    SELECT 
    SQL_CALC_FOUND_ROWS DISTINCT (annonce.id_annonce),
     titre_francais,
     annonce.id_membre,
     ...... ,
     annonce_avant,
     CASE WHEN date_annonce > '2017-01-14' THEN 1 ELSE 0 END AS news,
    question.nb_reponse 
    FROM annonce 
    JOIN annonce_expedition ON annonce_expedition.id_annonce = annonce.id_annonce 
    JOIN membre ON membre.id_membre = annonce.id_membre 
    JOIN annonce_titre ON annonce.id_titre = annonce_titre.id_titre 
    JOIN annonce_libelle ON annonce.id_libelle = annonce_libelle.id_libelle 
    LEFT JOIN annonce_option ON annonce.id_annonce = annonce_option.id_annonce 
     
    LEFT JOIN ( 
    SELECT 
    SUM(CASE WHEN annonce_reponse.id_annonce_question IS NOT NULL THEN 0 ELSE 1 END) AS nb_reponse,
     annonce_question.id_annonce 
    FROM annonce_question 
     LEFT JOIN annonce_reponse ON annonce_question.id_annonce_question = annonce_reponse.id_annonce_question
     ######## ) question 
    ON annonce.id_annonce = question.id_annonce 
     
    WHERE annonce.id_membre ='1' 
    AND annonce_cloture = 0 
    AND annonce_vendu = 0 
    AND annonce_archive = 0 
    ORDER BY annonce_cloture 
    LIMIT 0,10
    sa marche parfaitement sauf que si le LEFT JOIN qui me ressort question fait des milions de ligne sa va ramer.

    Donc mon problème, je n'arrive pas à voir comment faire un WHERE annonce_question.id_annonce = annonce.id_annonce à la place des ######## sans avoir à faire une nouvelle jointure dans ce LEFT JOIN

    Merci d'avance à vous

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Juillet 2024
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2024
    Messages : 15
    Points : 0
    Points
    0
    Par défaut jean-jacques
    bonjour,

    je ne comprends pas trop la question

    mais si vous voulez vous dispenser du LEFT JOIN, il faut revenir a du code plus ancien du SQL avec l'opérateur (+) de jointure externe dans le WHERE

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE annonce_question.id_annonce = annonce.id_annonce(+)

    cordialement

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 266
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 266
    Points : 8 564
    Points
    8 564
    Billets dans le blog
    17
    Par défaut
    On peut sûrement améliorer cela, par exemple en intégrant WHERE annonce.id_membre ='1' à la sous-requête, ou en revoyant complète la requête.
    Mais il me sera difficile d'en dire plus sans un échantillon de données et le résultat attendu sur l'échantillon

    @LEGALLJJA
    Cette syntaxe n'a jamais été supportée par MySQL

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 911
    Points : 6 704
    Points
    6 704
    Par défaut
    En tout cas c'est l'occasion idéale de revoir 7 ans de réflexion.

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 960
    Points : 4 389
    Points
    4 389
    Par défaut
    Avec les index là où ils doivent être, un UNION ALL peut-être plus efficace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT 
    COUNT(annonce_reponse.id_annonce_question) AS nb_reponse,
     annonce_question.id_annonce 
    FROM annonce_question 
     JOIN annonce_reponse ON annonce_question.id_annonce_question = annonce_reponse.id_annonce_question
    GROUP BY annonce_question.id_annonce 
     
     
    UNION ALL
     
    SELECT 
     0,
     annonce_question.id_annonce 
    FROM annonce_question 
    WHERE NOT EXISTS(SELECT 1 FROM annonce_reponse WHERE annonce_question.id_annonce_question = annonce_reponse.id_annonce_question)

Discussions similaires

  1. [Access] Requête avec LEFT JOIN et 3 tables
    Par estelledany dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/06/2006, 14h27
  2. Reqête avec LEFT JOIN
    Par kirsoul dans le forum Requêtes
    Réponses: 5
    Dernier message: 26/12/2005, 19h00
  3. Plantage Mysql avec LEFT JOIN
    Par verticka dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/09/2005, 12h45
  4. requete avec left join et group by
    Par slc dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/09/2004, 19h03
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 14h57

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