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 08/06/2011, 23h48   #1
Invité de passage
 
Homme
Webmaster
Inscription : juin 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Polynésie

Informations professionnelles :
Activité : Webmaster
Secteur : Communication - Médias

Informations forums :
Inscription : juin 2011
Messages : 2
Points : 0
Points : 0
Par défaut SELECT, JOIN et sous-requêtes dans une même colonne

Bonjour à tous,

J'ai commencé le SQL il y a maintenant 1 semaine et j'ai un problème que je n'arrive pas à résoudre du fait de mes faibles connaissances.

J'ai 2 tables utilisateurs et udatas sous la forme suivante :

Code :
1
2
3
4
5
CREATE TABLE utilisateur 
(ID INTEGER, 
Nom VARCHAR(60), 
Prenom VARCHAR(60),
EMAIL VARCHAR(100))
Code :
1
2
3
4
5
CREATE TABLE udatas 
(data_id INTEGER, 
user_id INTEGER, 
data_key VARCHAR(100), 
data_value VARCHAR(100))
Avec les données suivantes (cf image)

Ce que j'aimerai faire c'est pouvoir récupérer les emails des abonnés ayant pour langue English et étant abonnés.

J'arrive à trier la table DATAS avec cette requête (si ça se trouve c'est complètement foireux comme façon de faire mais c'est tout ce que j'ai trouvé)

Code :
1
2
3
4
5
6
SELECT F.user_id, F.data_value, S.data_value
FROM datas F
INNER JOIN datas S ON
F.user_id = S.user_id
WHERE F.data_value = 'oui'
AND S.data_value = 'English'
Mais ce que je ne sais pas faire c'est comment joindre le résultat de cette requête avec la table utilisateurs pour en sortir les emails de mes abonnés et anglophone.

J'espère avoir été clair dans mes explications. En vous remerciant par avance.
Alcorak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 03h53   #2
Invité de passage
 
Homme
Webmaster
Inscription : juin 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Polynésie

Informations professionnelles :
Activité : Webmaster
Secteur : Communication - Médias

Informations forums :
Inscription : juin 2011
Messages : 2
Points : 0
Points : 0
Je me répond a moi-même si ça peut aider d'autres personnes sait-on jamais :

Il suffisait de déclarer ma sous-requête en tant que table sur laquelle effectuer la requête des emails ce qui donne

Code :
1
2
3
4
5
6
7
8
SELECT utilisateur.EMAIL
FROM (SELECT F.user_id, F.data_value, S.data_value
FROM datas F
INNER JOIN datas S ON
F.user_id = S.user_id
WHERE F.data_value = 'oui'
AND S.data_value = 'English') AS datas
LEFT JOIN utilisateur ON datas.user_id = utilisateur.ID
Bon le code est encore à optimiser en enlevant tout ce qui ne sert pas mais l'essentiel est là.
Alcorak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/06/2011, 09h04   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Bonjour,

Passe plutôt par les jointures que par des sous-requêtes...
De plus, il manque une condition sur data_key pour être plus rigoureux sur le choix de langue et d'un abonné.

Exemple de requête qui devrait fonctionner (je n'ai pas testé) :
Code :
1
2
3
4
SELECT u.email
FROM utilisateur u
INNER JOIN datas a ON u.id = a.user_id AND a.data_key = 'Abonne' AND a.data_value = 'oui'
INNER JOIN datas l ON u.id = l.user_id AND l.data_key = 'Langue' AND l.data_value = 'English'
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web