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 :

SELECT + INNER JOIN un peu spécifique


Sujet :

Langage SQL

  1. #1
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut SELECT + INNER JOIN un peu spécifique
    Bonjour à tous,

    j'essaye d'établir une requête me permettant de lister des membres inscrits à une newsletter précise.

    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
    32
    33
    34
    35
    36
    CREATE TABLE `t_membre` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      `nom` VARCHAR(100) NOT NULL,
      `email` VARCHAR(255) NOT NULL,
      `fullnews` TINYINT(1) UNSIGNED NOT NULL DEFAULT TRUE,
     
      PRIMARY KEY (`id`),
      UNIQUE KEY `email` (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `t_membre` VALUES
    (1, 'AAA', 'aaa@aaa.fr', FALSE), 
    (2, 'BBB', 'bbb@bbb.fr', FALSE), 
    (3, 'CCC', 'ccc@ccc.fr', FALSE, 
    (4, 'DDD', 'ddd@ddd.fr', TRUE);
     
    CREATE TABLE `t_inscription` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      `membre_id` INT UNSIGNED NOT NULL,
      `etablissement_id` TINYINT UNSIGNED NOT NULL,
      PRIMARY KEY (`id`),
      FOREIGN KEY (`membre_id`) REFERENCES `t_membre` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      FOREIGN KEY (`etablissement_id`) REFERENCES `t_etablissement` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
     
    INSERT INTO `t_inscription` VALUES
    (1, 1, 1),
    (2, 1, 5),
    (3, 1, 6),
    (4, 1, 10),
    (5, 2, 1),
    (6, 2, 2),
    (7, 2, 3),
    (8, 2, 4),
    (9, 3, 2),
    (10, 3, 9);
    Contexte :
    ¤ 1 newsletter correspond à 1 établissement
    ¤ Un membre peut s'inscrire à la totalité des newsletters, son champ fullnews = TRUE
    ¤ Un membre peut s'inscrire à certaines newsletters.

    J'aimerais par exemple obtenir tous les membres inscrits à l'établissement n°2.
    Normalement, je devrais obtenir les membres 2,3 et 4 car 1 (= "AAA") n'est pas inscrit à l'établissement n°2 et 4 (="DDD") est inscrit en fullnews...

    A partir de cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id, nom, email 
    FROM t_membre 
    WHERE fullnews=1;
    je pense qu'il faille utiliser la clause INNER JOIN mais je n'y arrive pas...

    Quelqu'un pourrait-il prendre un peu de son temps pour m'aiguiller...
    Merci d'avance
    @+

  2. #2
    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
    salut

    comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select id,nom,email 
    from t_membre
    inner join t_inscription
    on t_membre.id=membre_id
    where etablissement_id = 2
    UNION
    SELECT id, nom, email 
    FROM t_membre 
    WHERE fullnews=1;
    petit edit pour prendre en compte ce qui sont inscrits à toutes les news

  3. #3
    Scorpi0
    Invité(e)
    Par défaut
    Je dirais comme ça plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT id,nom,email 
    FROM t_membre
    INNER JOIN t_inscription
    ON t_membre.id=membre_id
    WHERE etablissement_id = 2
    OR fullnews=1;
    Edit : Ah oui bouley moi, ça risquait pas de marcher
    Le solution citée plus haut devrait-être bonne.
    Dernière modification par Scorpi0 ; 27/08/2008 à 17h55.

  4. #4
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    merci pour votre aide mais cela n'est pas encore bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t_membre.id, nom, email
    FROM t_membre
    INNER JOIN t_inscription ON t_membre.id = t_inscription.membre_id
    WHERE etablissement_id = 2
    OR fullnews = 1
    ne m'affiche pas le membre n°4 (avec fullnews = TRUE)

  5. #5
    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
    j'ai modifié ma 1ere requète pour qu'elle prenne en compte ceux inscrits à toutes les news

  6. #6
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    Merci pour ton aide Cybher,

    ta requête semble fonctionné (en remplaçant id par t_membre.id).
    Cependant, je viens de trouver cette manière qui fonctionne également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t_membre.id, nom, email
    FROM t_inscription
    RIGHT OUTER JOIN t_membre ON t_membre.id = t_inscription.membre_id
    WHERE t_inscription.etablissement_id = 2
    OR t_membre.fullnews = TRUE
    Laquelle est la mieux ? C'est pareil ?

  7. #7
    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
    peut être que ta requête est un peu meilleure niveau perf.
    Lance les 2 requêtes, tu verras laquelle est la plus rapide

  8. #8
    Membre actif
    Inscrit en
    Octobre 2005
    Messages
    908
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 908
    Points : 271
    Points
    271
    Par défaut
    avec le peu d'enregistrements que j'ai, la tienne semble plus rapide !
    0.0004 sec au lieu de 0.0009 sec sur 3/4 tests rapidos...

    Par contre, bizarrement, avec ma requête j'obtiens dans phpMyAdmin 2.7 un tableau des résultats avec les colonnes d'actions à gauche (edit, drop, ...)
    Alors qu'avec la tienne, la première colonne contient l'id du membre.
    Pourquoi cette différence ?

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

Discussions similaires

  1. Select .. inner join sur plusieurs tables
    Par 3titi92 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 08/01/2015, 13h19
  2. [SQL] Requête SELECT et INNER JOIN
    Par polemoss dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 17/01/2008, 15h11
  3. SQL inner join select temps d'éxécution
    Par binouzzz19 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/10/2007, 15h50
  4. Un doute...select avec INNER JOIN
    Par Thierry8 dans le forum Requêtes
    Réponses: 6
    Dernier message: 18/12/2005, 17h14
  5. Inner Join & Select
    Par bakaneko dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/02/2004, 11h48

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