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 27/05/2011, 21h24   #1
Membre à l'essai
 
Inscription : novembre 2006
Messages : 121
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 121
Points : 22
Points : 22
Par défaut Autojointure sur modèle entité attribut valeur

Bonjour,

J'ai une table qui utilise le modèle entité attribut valeur (la table postmeta de wordpress) qui stocke pour chacun de mes post (post_id), un nombre indéterminé de couple clé/valeur :




Deux clés m'intéressent particulièrement : views et viewcount, donc je souhaiterais récupérer une liste des mes post_id avec pour chaque post_id la valeur de views et la valeur de viewcount :




Je ne vois pas du tout comment faire, j'ai essayé avec un LEFT JOIN mais je bloque. En général quand on fait une jointure on utilise le nom d'un champ dans le ON :
LEFT JOIN table2 ON table1.champ = table2.champ.

Mais là c'est sur la valeur du champ meta_key qu'il faudrait faire la jointure, ça me dépasse complétement .

Pourriez-vous m'aider ?
Télécharger la table postmeta

Merci
Galdon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2011, 21h53   #2
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
Salut,

La petite difficulté vient du fait que, visiblement, views et viewcount ne sont pas systématiquement renseignés pour un post_id donné (au moins un des 2 est renseigné, mais pas nécessairement les 2, non ?).
Ou au moins viewcount est-il toujours renseigné ?
En partant du principe que non, essaie comme ça :
Code :
1
2
3
4
5
SELECT p.post_id, v.meta_value AS views, c.meta_value AS viewcount
FROM  postmeta p
LEFT JOIN postmeta v ON p.post_id = v.post_id AND v.meta_key = 'views'
LEFT JOIN postmeta c ON p.post_id = c.post_id AND c.meta_key = 'viewcount'
ORDER BY p.post_id
Si viewcount est toujours renseigné pour un post_id, alors la deuxième jointure n'est plus utile :
Code :
1
2
3
4
SELECT p.post_id, v.meta_value AS views, p.meta_value AS viewcount
FROM  postmeta p
LEFT JOIN postmeta v ON p.post_id = v.post_id AND v.meta_key = 'views'
ORDER BY p.post_id
À tester...

ced
__________________
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
Vieux 27/05/2011, 22h37   #3
Membre à l'essai
 
Inscription : novembre 2006
Messages : 121
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 121
Points : 22
Points : 22
Ok merci, je ne savais pas qu'on pouvait ajouter des AND après le ON.

Normalement views et viewcount sont tous les deux renseignés, mais ça n'est pas vrai pour tous les tuples, il y a quelques exceptions.

Entre temps j'ai trouvé une autre solution avec des tables temporaires :

Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT
	wpst_postmeta.post_id,
	wpst_posts.post_title,
	wpst_posts.post_type,
	views.meta_value AS views,
	viewcount.meta_value AS viewcount,
	ABS(viewcount.meta_value-views.meta_value) AS difference
FROM (SELECT DISTINCT post_id FROM wpst_postmeta) wpst_postmeta
LEFT JOIN wpst_posts ON wpst_postmeta.post_id = wpst_posts.ID
LEFT JOIN (SELECT post_id, meta_value FROM wpst_postmeta WHERE meta_key = 'views') views ON wpst_postmeta.post_id = views.post_id
LEFT JOIN (SELECT post_id, meta_value FROM wpst_postmeta WHERE meta_key = 'viewcount') viewcount ON wpst_postmeta.post_id = viewcount.post_id
Bon la requête est un peu violente parce que j'ai ajouté d'autres champs de la table post, mais ça marche super sinon !
Galdon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2011, 16h43   #4
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
Ouh là, ça fait beaucoup de sous-requêtes et des performances qui risquent de se dégrader, une telle requête...
Sinon, il y a visiblement un problème de modélisation. Dans ta requête, tu fais une différence sur le champ meta_value qui, dans ta table, est de type LONGTEXT...

Sinon, c'est ?

ced
__________________
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 20h13.


 
 
 
 
Partenaires

Hébergement Web