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 :

[Requete imbriqué] Existe-il plus simple, ou plus optimisé ?


Sujet :

Requêtes MySQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 207
    Points
    207
    Par défaut [Requete imbriqué] Existe-il plus simple, ou plus optimisé ?
    Bonjour,

    Dans ma base il y a deux tables
    Table1: clé primaire: id_champ

    Table2: id_champ id_champ_1 id_champ_2

    Les trois id_champ de la table 2 font références à l'id_champ de Table1.

    Ma requête consiste à récupérer tous les id_champ de la table1 qui ne sont pas dans les trois id_champ de Table2.

    Pour le moment j'ai ceci:
    SELECT id_champ
    FROM Table1
    WHERE id_champ NOT IN
    (
    SELECT id_champ FROM Table2
    UNION
    SELECT id_champ_1 id_champ FROM Table2
    UNION
    SELECT id_champ_2 id_champ FROM Table2
    )

    Donc cela fonctionne très bien, ma question est donc:
    Existe-il plus simple, ou plus optimisé ?

    Merci

  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 040
    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 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Bonjour,

    Une version peut-être plus optimisée (parce que sans sous-requête) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1.id_champ
    FROM Table1 t1
    left join Table2 t2 on t1.id_champ = t2.id_champ
    left join Table2 t2_1 on t1.id_champ = t2_1.id_champ_1
    left join Table2 t2_2 on t1.id_champ = t2_1.id_champ_2
    where t2.id_champ is null or t2_1.id_champ_1 is null or t2_2.id_champ_2 is null
    Je n'ai pas testé...

    ced

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 207
    Points
    207
    Par défaut
    Hélas, cela ne fonctionne pas. Il n'y a pas d'erreur, mais il me retourne toutes les lignes de la table1.

    Mais plus j'y réfléchis plus je me demande si ce que j'ai fais n'est pas la seule solution. C'est pour cela que je suis venu ici, au cas où quelqu'un de plus expérimenté aurait quelque chose de plus simple

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    Citation Envoyé par ced Voir le message
    Bonjour,

    Une version peut-être plus optimisée (parce que sans sous-requête) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1.id_champ
    FROM Table1 t1
    left join Table2 t2 on t1.id_champ = t2.id_champ
    left join Table2 t2_1 on t1.id_champ = t2_1.id_champ_1
    left join Table2 t2_2 on t1.id_champ = t2_1.id_champ_2
    where t2.id_champ is null or t2_1.id_champ_1 is null or t2_2.id_champ_2 is null
    Je n'ai pas testé...

    ced
    puisqu'il faut qu'il ne soit dans aucune des 3 colonnes, j'aurais remplacé les 'OR' par des 'AND'

    et pareil que Ced, je n'ai pas testé

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 207
    Points
    207
    Par défaut
    Ah bé oui, cela fonctionne bien mieux qu'avec les OR, merci à tous les deux.

    Maintenant au niveau des performances, vous en pensez quoi ? Vu que ça se passe en local et sur quelques lignes de données, je ne peux tester d'une manière concrète les performances.

  6. #6
    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 040
    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 040
    Points : 23 795
    Points
    23 795
    Par défaut
    Ca m'apprendra à ne pas tester...

    Personnellement, je pense que les jointures sont plus performantes que les sous-requêtes.
    Plus d'explications ici, règle 10.

    ced

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 76
    Points : 207
    Points
    207
    Par défaut
    On peut remarquer que beaucoup de requêtes peuvent être faites en utilisant les jointures.

    Merci encore pour les explications.

    @tte

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/10/2011, 17h23
  2. Réponses: 19
    Dernier message: 16/08/2010, 01h23
  3. Réponses: 19
    Dernier message: 16/08/2010, 01h23
  4. [PHP 5.0] Requête plus simple et plus "jolie"
    Par Equinoxe5 dans le forum Langage
    Réponses: 7
    Dernier message: 16/01/2009, 16h13
  5. [layout]il existe pas des layout plus simple et plus rapide?
    Par soad dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 28/11/2005, 12h03

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