Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/12/2011, 02h31   #1
Invité régulier
 
Inscription : décembre 2005
Messages : 11
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 11
Points : 5
Points : 5
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 :
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
bouket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 07h54   #2
Membre du Club
 
Consultant KPI
Inscription : août 2010
Messages : 23
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant KPI

Informations forums :
Inscription : août 2010
Messages : 23
Points : 43
Points : 43
Bonjour,

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

Code :
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 ?
DeTraX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 13h38   #3
Invité régulier
 
Inscription : décembre 2005
Messages : 11
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 11
Points : 5
Points : 5
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 !

bouket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2011, 14h47   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 657
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 657
Points : 2 660
Points : 2 660
Bonjour,


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

Code :
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 ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2012, 14h23   #5
Membre du Club
 
Consultant KPI
Inscription : août 2010
Messages : 23
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant KPI

Informations forums :
Inscription : août 2010
Messages : 23
Points : 43
Points : 43
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 :
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)
DeTraX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 14h59   #6
Modérateur
 
Inscription : octobre 2008
Messages : 1 508
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 508
Points : 2 040
Points : 2 040
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/01/2012, 10h50   #7
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 099
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 099
Points : 1 922
Points : 1 922
Bonjour,
On peut aussi le faire avec une jointure Externe:
Code SQL :
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.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h42.


 
 
 
 
Partenaires

Hébergement Web