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 04/05/2011, 17h21   #1
Invité de passage
 
Inscription : mai 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 4
Points : 0
Points : 0
Par défaut Aide pour requête SQL

Bonjour a tous,

Premier post pour moi ici, j'espère formaliser les choses de façon claires .
Je suis un développeur et cela fait un bon moment que je n'ai pas eu a travailler avec une base de donnée relationnelle.

En l’occurrence je travaille sur un projet en java qui interagit avec une base de donnée mysql centralisant les projets d'une région. Les projets sont postés par l'intermédiaire d'un blog chaque projet ayant une id unique.

La structure de la table qui m’intéresse est la suivante :
  • meta_id bigint(20)
  • post_id bigint(20)
  • meta_key varchar(255)
  • meta_value longtext

meta_id est une clé primaire qui ne m’intéresse pas pour la requête, post_id permet de rattacher un ensemble de couple (meta_key, meta_value) a un projet unique, et la liste des meta_key / meta_value permet de stocket pour chaque projet un ensemble de critères comme le département ou bien la catégorie dans laquelle le projet a été posté.

Un exemple d'enregistrement peut donc être :

Code :
1
2
3
4
5
6
post_id 	meta_key 	 	meta_value
----------------------------------------------------
 1 	 	  etab_dep 	 	     75
 1 	  	  domaine_du_projet 	  	     Multimedia
 1 	 	  ... 	 	             ...
 1                etc                        etc
Et j'aimerais pour chaque id récupérer en une seule requete le département et le domaine.

J'ai essayé cette requête qui semble fonctionner :

Code :
1
2
SELECT post_id,meta_value FROM `wp_postmeta`
WHERE post_id=1 AND meta_key IN('etab_dep', 'domaine_du_projet' )
Le résultat étant :
Code :
1
2
3
4
5
 
post_id     meta_value
-------------------------
   1         Multimedia
   1               75
Et j'aimerais avoir un résultat du type :
Code :
1
2
3
4
 
post_id     meta_value         meta_value
------------------------------------------
   1         Multimedia               75
Est-ce possible ?
Cela-a-il un impact sur les performances ?
Ne devrais pas plutot laisser ma requête telle quelle et laisser mon programmer récupérer les bonnes valeurs dans les bonnes variables ?

Merci de votre aide,
K
Kailash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 17h50   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
On est la encore sur des requetes utilisant le "PIVOT"

il y a quelques post sur ce sujet dans la semaine


mais je trouve, mais peut etre ai-mal compris (ce qui m'arrive souvent) , qu'il y a surtout un probleme dans la structuration de la base.

mais meme bien structure, cela ne changera pas le pb du PIVOT,
j'ai cru entendre que cette possibilite existe en MySQL
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h16   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Vous pouvez le faire en effectuant une auto-jointure :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
 
SELECT 
    post_id,
    depart.meta_value AS departement
    Domaine.meta_value AS Domaine
FROM `wp_postmeta` depart
LEFT OUTER JOIN `wp_postmeta` domaine
    ON depart.post_id = domaine.post_id
    AND domaine.meta_key = 'domaine_du_projet' 
WHERE depart.post_id=1 
    AND depart.meta_key = 'etab_dep'
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h26   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
re

aieeeuuuuu en es-tu sur ?

Citation:
post_id meta_key meta_value
----------------------------------------------------
1 depart 75
1 domaine Multimedia
1 domaine Web
1 ... ...
1 etc etc
comment doit figurer "Web" sur une nouvelle ligne, ou une nouvelle colonne ?

Kailash ?
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h34   #5
Invité de passage
 
Inscription : mai 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 4
Points : 0
Points : 0
En fait une post_id n'a qu'un seul domaine ou département possible.
Du coup ce n'est pas possible d'avoir plusieurs lignes domaine par id.
Je sais que la structure de la base de données peut paraître un peu bizarre.
En fait il faut comprendre que cette table contient tout un tas de meta_tag (sous la forme meta_key='tag' / meta_value='valeur_du_tag'). Mais chaque tag (qui peut etre le département, un numéro de dossier, le domain etc) sont uniques par projet.

J'ai édité mon premier post j'avais fait une erreur qui a pu engendrer une confusion je m'excuse. depart est en fait etab_dep et domaine est domaine_du_projet.

Merci.
Kailash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h40   #6
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Code :
1
2
3
4
5
6
post_id 	meta_key 	 	meta_value
----------------------------------------------------
 1 	 	  depart 	 	     75
 1 	  	  domaine 	  	     Multimedia
 1 	 	  ... 	 	             ...
 1                etc                        etc

donc ce modele est impossible (avec plus de 2 pos_id), correct ?

Code :
1
2
3
4
5
6
7
8
post_id 	meta_key 	 	meta_value
----------------------------------------------------
 1 	 	  depart 	 	     75
 1 	  	  domaine 	  	     Multimedia
  2 	 	  depart 	 	     76
 2 	  	  domaine 	  	     Web1
 	 	  ... 	 	             ...
 ...              etc                        etc
si oui, la requete de aieeeuuuuu est parfaite
dehorter olivier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 18h51   #7
Invité de passage
 
Inscription : mai 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 4
Points : 0
Points : 0
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
post_id 	meta_key 	 	meta_value
----------------------------------------------------
 1 	 	  depart 	 	     75
 1 	  	  domaine 	  	     Multimedia
 2 	 	  depart 	 	     76
 2 	  	  domaine 	  	     Web1
 	 	  ... 	 	             ...
 ...              etc                        etc
 
si oui, la requete de aieeeuuuuu est parfaite
C'est la structure exacte de la table.
Kailash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/05/2011, 19h45   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Messages aux intervenants réguliers : essayez de l'apprendre celle-là parce qu'elle revient très souvent et fréquemment vous ne proposez pas la meilleure solution !
Si l'auteur cherchait à construire un pivot sur douze valeurs (un par mois, structure fixe donc acceptable), vous feriez onze jointures externes ?
J'en doute !

Il vaut mieux écrire la requête ainsi (un seul table scan, syntaxe normative multi SGBD) :
Code :
1
2
3
4
5
6
7
  SELECT post_id
       , max(case meta_key when 'domaine_du_projet' then meta_value end) AS domaine
       , max(case meta_key when 'etab_dep'          then meta_value end) AS etab_dep
    FROM wp_postmeta
   WHERE meta_key IN ('etab_dep', 'domaine_du_projet')
GROUP BY post_id
ORDER BY post_id ASC
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 04/05/2011, 23h57   #9
Invité de passage
 
Inscription : mai 2011
Messages : 4
Détails du profil
Informations forums :
Inscription : mai 2011
Messages : 4
Points : 0
Points : 0
Enorme merci beaucoup Waldar tu n'as pas idée au combien tu viens de simplifier mon programme et mes nuits par la même occasion. Merci encore !!!
Kailash est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/05/2011, 10h23   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par Waldar Voir le message
Il vaut mieux écrire la requête ainsi (un seul table scan, syntaxe normative multi SGBD) :


Citation:
Si l'auteur cherchait à construire un pivot sur douze valeurs vous feriez onze jointures externes ?
J'en doute !
même pas peur, à défaut d'être bon, je suis courageux
aieeeuuuuu 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 09h50.


 
 
 
 
Partenaires

Hébergement Web