Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 01/03/2011, 19h43   #1
Invité de passage
 
Inscription : octobre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 6
Points : 3
Points : 3
Par défaut 2 tables liées : sélectionner lorqu'un champ est ABSENT

Bonjour,

Je suis débutant en SQL, et je me retrouve confronté à un problème sur une requête complexe.

J'ai des informations stockées dans des entrées. Chaque entrée peut avoir plusieurs champs. Chaque champ a un nom et une valeur, et a donc une entrée à laquelle il appartient.
Chaque entrée a un type qui permet de différencier les informations (ce type est détaillé dans une 3e table non décrite ci-dessous). Une entrée peut par exemple être de type 'Contact' (renseignant les coordonnées d'une personne physique), 'Favori Internet', 'Info' (renseignant un info diverse)...

DESCRIPTION DES TABLES

Voici la description des tables dont je veux parler, avec à leur droite la description de chaque champ (les champs sont importantes sont décrits en majuscules) :

Table 'champs':
Code :
1
2
3
4
5
6
7
8
9
10
#----------+---------+-----+----------------+
# Field    | Type    | Key | Extra          |
#----------+---------+-----+----------------+
# id       | int(11) | PRI | auto_increment | Identifiant du champ
# eid      | int(11) |     |                | IDENTIFIANT DE L'ENTRÉE À LAQUELLE APPARTIENT LE CHAMP
# nom      | text    |     |                | NOM DU CHAMP
# type     | int(11) |     |                | Type de valeur
# valnum   | int(11) |     |                | Valeur numérique du champ
# valstr   | text    |     |                | Valeur alphanumérique du champ
#----------+---------+-----+----------------+

Table 'entrees':
Code :
1
2
3
4
5
6
#-------+---------+-----+----------------+
# Field | Type    | Key | Extra          |
#-------+---------+-----+----------------+
# id    | int(11) | PRI | auto_increment | IDENTIFIANT DE L'ENTRÉE
# TE_id | int(11) |     |                | Type d'entrée
#-------+---------+-----+----------------+


EXEMPLE

Les données de la table 'entrees' pourraient être ceci:
Code :
1
2
3
4
5
6
7
#----+-------+
# id | TE_id |
#----+-------+
# 46 |     4 |
# 47 |     4 |
# 48 |     5 |
#----+-------+
TE_id pointe vers la 3e table décrivant chaque type d'entrée. Dans cet exemple, '4' décrit un favori Internet (cf. + basdans la table 'champs' : "Thomann" et "Ziggy's Sono"), et '5' une information diverse (cf. + bas : "Adresse MAC")


Les données de la table 'champs' pourraient être ceci:
Code :
1
2
3
4
5
6
7
8
9
10
#-----+-----+-------------+------+--------+-----------------------------------------------+
# id  | eid | nom         | type | valnum | valstr                                        |
#-----+-----+-------------+------+--------+-----------------------------------------------+
# 148 |  46 | Description |    2 |      0 | Thomann                                       |
# 147 |  46 | Adresse     |    3 |      0 | http://www.thomann.de/fr/index.html           |
# 149 |  47 | Description |    2 |      0 | Ziggy's Sono                                  |
# 150 |  47 | Adresse     |    3 |      0 | http://www.ziggysono.com/htm_effets/index.php |
# 151 |  48 | Titre       |    2 |      0 | Adresse MAC                                   |
# 153 |  48 | Info        |    2 |      0 | 00:11:22:33:44:55                             |
#-----+-----+-------------+------+--------+-----------------------------------------------+
On a: champs.eid --> entrees.id
Chaque champ appartient à une entrée particulière désignée par champs.eid.


MON PROBLEME :

Je voudrais faire une requête personnalisée permettant de rechercher les entrées ne possédant PAS un champ nommé particulier.
Par exemple une requête sélectionnant les entrées ne possédant pas de champ nommé 'Info' donnerait :
Code :
1
2
3
4
5
6
#-----+
# eid |
#-----+
#  46 |
#  47 |
#-----+

C'est facile dans l'autre sens (c.à.d. rechercher les entrées POSSÉDANT un champ particulier) en faisant:
Code :
SELECT DISTINCT (eid) FROM champs WHERE nom='Info';
Mais je ne vois pas comment faire le 'ne possédant PAS' ! En effet la requête suivante :
Code :
SELECT DISTINCT (eid) FROM champs WHERE nom!='Info';
ne marche évidemment pas puisqu'elle trouve les autres champs de l'entrée à ne pas afficher, donc incluent l'entrée dans le résultat de la requête.

Comment effectuer cette requête?
Merci d'avance!

PS : bien que certaines remarques puissent être utiles, ce que je demande n'est pas un conseil sur la structure des tables (qui sont déjà bien implantées telles qu'elles sont dans des fichier PHP), mais bien sur la requête à effectuer pour arriver à mes fins.
yolenoyer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/03/2011, 21h59   #2
Membre Expert
 
Avatar de Nudger
 
Homme Thomas Arnaud
Directeur de projet
Inscription : octobre 2010
Messages : 452
Détails du profil
Informations personnelles :
Nom : Homme Thomas Arnaud
Âge : 36
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Directeur de projet
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : octobre 2010
Messages : 452
Points : 1 012
Points : 1 012
Envoyer un message via Skype™ à Nudger
Bonsoir,

Code :
1
2
SELECT DISTINCT (c1.eid) FROM champs c1 
WHERE NOT EXISTS (SELECT c2.eid FROM champs c2 WHERE c2.eid= c1.eid AND c2.nom='Info')
__________________
www.nudge.org Surveillez et optimisez vos applications Java
Nudger est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 15h40   #3
Invité de passage
 
Inscription : octobre 2010
Messages : 6
Détails du profil
Informations forums :
Inscription : octobre 2010
Messages : 6
Points : 3
Points : 3
Merci beaucoup, ça marche à merveille!
yolenoyer 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 14h51.


 
 
 
 
Partenaires

Hébergement Web