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 :

Jointure et NOT IN


Sujet :

Requêtes MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Jointure et NOT IN
    J'observe une différence de comportement dans le traitement de la requête suivante entre une version MySQL 5.0.41 tournant sous MAMP en local et MySQL 5.0.32 sous serveur mutualisé OVH :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT C.id_candidat 
    FROM (preins_candidats C, preins_dispo D, preins_horaires H) 
    LEFT JOIN preins_affect A ON (C.id_candidat = A.id_candidat) 
    WHERE C.id_candidat = D.id_candidat AND D.id_horaire = H.id_horaire AND (A.id_candidat IS NULL OR A.definitif = 'non' OR A.id_horaire NOT IN (SELECT DISTINCT(id_horaire) FROM preins_dispo D WHERE id_candidat = C.id_candidat)) 
    GROUP BY C.id_candidat
    Sous OVH la sous-requête "A.id_horaire NOT IN (SELECT" fonctionne l'opérateur C.id_candidat est reconnu alors que sous MAMP non.

    Si on tape la commande "EXPLAIN SELECT" pour la requête sous MAMP en local la DEPENDENT SUBQUERY retourne "func,func" en ref, alors que sous OVH la ref de la clef est trouvée "base.C.id_candidat,func"

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Le problème vient du mélange des écritures de jointures normalisées (avec LEFT JOIN entre les tables) et non normalisées (avec des virgules entre les tables).
    C'est déconseillé, surtout depuis la version 5.0 de MySQL.

    Plus d'infos à ce sujet dans la : http://mysql.developpez.com/faq/?pag...ltiples_mysql5

    ced

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2009
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci. J'ai réécrit la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT C.id_candidat, CONCAT(UPPER(nom),' ',prenom) AS fullname, MAX(DATE_ADD(DATE_ADD(H.date,INTERVAL heure HOUR_SECOND), 
    INTERVAL duree MINUTE)) AS fin, 
    GROUP_CONCAT(DISTINCT(REPLACE(P.sur_audition, 'EV', 'choeur')) ORDER BY id_pupitre1) AS jurys, 
    GROUP_CONCAT(DISTINCT(H.id_horaire) ORDER BY H.id_horaire) AS dispos, 
    A.id_horaire, A.definitif 
    FROM preins_candidats C 
    JOIN preins_voeux V ON (C.id_candidat = V.id_candidat) 
    JOIN pupitres P 
    JOIN preins_dispo D ON (C.id_candidat = D.id_candidat) 
    JOIN preins_horaires H ON (D.id_horaire = H.id_horaire) 
    JOIN preins_affect A ON (C.id_candidat = A.id_candidat) 
    WHERE id_pupitre IN (id_pupitre1,id_pupitre2,id_pupitre3,id_pupitre4) AND (A.id_candidat IS NULL OR A.definitif = 'non' OR A.id_horaire NOT IN (SELECT DISTINCT(id_horaire) FROM preins_dispo D WHERE id_candidat = C.id_candidat)) 
    GROUP BY C.id_candidat ORDER BY fin
    La différence de résultat perdure, sous MAMP la sous-requête n'est pas interprétée alors que sous OVH oui.

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Ta requête, en l'état et sans éléments supplémentaires sur ton schéma, est trop complexe pour pouvoir facilement trouver d'où vient le problème.
    Peut-on voir le schéma des tables, quelques données exemples et le résultat que tu souhaites obtenir ?

    ced

Discussions similaires

  1. [MySQL] Requête sur table de jointure avec not in ou not exists
    Par GueloSuperStar dans le forum Langage SQL
    Réponses: 12
    Dernier message: 08/03/2013, 15h01
  2. Jointure et NOT IN ?
    Par polo7 dans le forum Requêtes
    Réponses: 17
    Dernier message: 16/08/2012, 22h22
  3. Réponses: 1
    Dernier message: 14/10/2008, 12h08
  4. Requete très simple : Jointure or not Jointure
    Par winx dans le forum Requêtes
    Réponses: 5
    Dernier message: 30/09/2008, 20h52
  5. Réponses: 10
    Dernier message: 14/12/2006, 12h53

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