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 :

Except ou Minus et jointure


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Except ou Minus et jointure
    Bonjour !

    j'ai un nouveau problème ! mysql/php...

    trois tables:

    members(member_id,co_name,key_contact)
    contacts(id_contact,con_f_name,con_l_name,con_email,location_id)
    redflag(id_record,member_id,date_added,location_id)

    mon objectif est de sortir 3 colonnes:
    -co_name
    -con_email
    -la concaténation de con_f_name et de con_l_name

    DANS LE CAS Où: member_id n'a pas de id_record dans redflag depuis un temps défini par php (entre deux dates du coup).

    Pour ceci, je récupère toutes les entrées dans members et je fais une jointure sur la table redflag, seulement dans ce cas, cela me sort seulement les member_id qui ont un id_record dans l'intervalle de temps défini.
    Ce que je voudrais c'est soustraire au lieu de joindre, seulement en essayant avec MINUS, cela n'a rien donné, EXCEPT non plus, mais peut-être que je les utilise mal. Voici la requête inverse que je n'arrive pas à rectifier...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT m.co_name,
    	c.con_email,
    	CONCAT(c.con_f_name,' ',c.con_l_name)
    FROM members m
    INNER JOIN contacts c ON c.contact_id = m.key_contact
    INNER JOIN
    (	SELECT r1.member_id, r1.location_id
    	FROM redflag r1
    	WHERE r1.date_added BETWEEN '$date_begin' AND '$date_ending'
    	GROUP BY r1.member_id
    ) t1 ON t1.location_id = c.location_id
    GROUP BY m.member_id
    Si vous pouviez m'aiguillez un peu, ça serait super, car je ne sais pas trop quoi utiliser finalement.

    Merci et bon réveillon à tous,
    bouket

  2. #2
    Membre régulier
    Homme Profil pro
    Data Analyste Senior
    Inscrit en
    Août 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Analyste Senior
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2010
    Messages : 53
    Points : 101
    Points
    101
    Par défaut
    Bonjour,

    En remplaçant les GROUP BY par des DISTINCT et le BETWEEN par un NOT BETWEEN ça donne quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT DISTINCT m.co_name,
    	        c.con_email,
    	        CONCAT(c.con_f_name,' ',c.con_l_name)
    FROM  members m
    INNER JOIN contacts c ON c.contact_id = m.key_contact
    INNER JOIN 
    (	SELECT DISTINCT r1.member_id, 
                            r1.location_id
    	FROM   redflag r1
    	WHERE  r1.date_added NOT BETWEEN '$date_begin' AND '$date_ending'
    ) t1 ON t1.location_id = c.location_id
    Et que doit-il se passer quand member_id n'a pas de id_record DU TOUT dans redflag ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    bonjour,

    s'il n'a pas du tout d'entrées dans la table redflag, il rentre donc dans le critère de la période de temps définie par défaut. Et doit apparaître dans le résultat des membre qui n'ont pas d'enregistrements dans la période de temps définie...

    je pense que le not between est bon... je vais faire quelques tests pour être sûr qu'il renvoie les bonnes répones,
    merci beaucoup !


  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,


    Je penses qu'il faudrait plutôt attaquer la sous-requête avec un NOT EXISTS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT DISTINCT m.co_name,
    	        c.con_email,
    	        CONCAT(c.con_f_name,' ',c.con_l_name)
    FROM  members m
    INNER JOIN contacts c ON c.contact_id = m.key_contact
    where not exists (select 1 from redflag r1 
    where r1.date_added BETWEEN '$date_begin' AND '$date_ending' and m.member_id = r1.member_id)
    Sinon j'ai pas compris votre jointure sur location_id, ne serai-ce pas plutôt sur membre_id qu'il faut joindre vos tables membre et redflag ?

  5. #5
    Membre régulier
    Homme Profil pro
    Data Analyste Senior
    Inscrit en
    Août 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data Analyste Senior
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2010
    Messages : 53
    Points : 101
    Points
    101
    Par défaut
    Citation Envoyé par punkoff Voir le message
    Sinon j'ai pas compris votre jointure sur location_id, ne serai-ce pas plutôt sur membre_id qu'il faut joindre vos tables membre et redflag ?
    Bonne remarque mais je pense qu'il faut plutôt faire une double jointure sur membre et location.

    Le but de la requête à l'air d'être de vouloir identifier la liste des membres qui n'ont pas d'alerte sur une localisation pendant un laps de temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT DISTINCT m.co_name,
    	        c.con_email,
    	        CONCAT(c.con_f_name,' ',c.con_l_name)
    FROM  members m
    INNER JOIN contacts c ON c.contact_id = m.key_contact
    WHERE NOT EXISTS (SELECT 1 
                      FROM   redflag r1 
                      WHERE  r1.date_added BETWEEN '$date_begin'
                                           AND     '$date_ending' 
                      AND    m.member_id   = r1.member_id
                      AND    m.location_id = c.location_id)

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par bouket Voir le message
    Ce que je voudrais c'est soustraire au lieu de joindre, seulement en essayant avec MINUS, cela n'a rien donné, EXCEPT non plus, mais peut-être que je les utilise mal. Voici la requête inverse que je n'arrive pas à rectifier...
    Il s'agit bien de mysql? D'après la FAQ de dvp, MINUS ou EXCEPT ne sont pas supportés par mysql.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 205
    Points : 12 786
    Points
    12 786
    Par défaut
    Bonjour,
    On peut aussi le faire avec une jointure Externe:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT DISTINCT m.co_name,
    	        c.con_email,
    	        CONCAT(c.con_f_name,' ',c.con_l_name)
    FROM  members m
    INNER JOIN contacts c ON c.contact_id = m.key_contact
    left outer join redflag r1 
    on r1.date_added BETWEEN '$date_begin' AND '$date_ending' AND m.member_id = r1.member_id
    where r1.member_id is null

    Tatayo.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/01/2012, 16h17
  2. Réponses: 0
    Dernier message: 21/04/2011, 12h03
  3. Jointure pouvant remplacer un MINUS
    Par Manlis dans le forum SQL
    Réponses: 4
    Dernier message: 18/11/2009, 09h07
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. c: gestion des exceptions
    Par vince_lille dans le forum C
    Réponses: 7
    Dernier message: 05/06/2002, 14h11

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