Partage
  • Partager sur Facebook
  • Partager sur Twitter

Autojointure, modèle entité attribut valeur

Sujet résolu
27 mai 2011 à 20:29:04

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 :

Image utilisateur


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 :

Image utilisateur


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
  • Partager sur Facebook
  • Partager sur Twitter
27 mai 2011 à 21:07:42

MySQL ne supporte pas le FULL OUTER JOIN donc tu vas devoir faire :

FROM posts p
LEFT JOIN postmeta a ON (a.post_id=p.post_id AND a.meta_key='viewcount')
LEFT JOIN postmeta b ON (b.post_id=p.post_id AND b.meta_key='views')
  • Partager sur Facebook
  • Partager sur Twitter
27 mai 2011 à 22:47:50

Merci, entre temps j'avais bricolé ça (un peu violent, ne pas lire à l'oeil nu) :

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
  • Partager sur Facebook
  • Partager sur Twitter
27 mai 2011 à 22:58:24

SELECT
	wpst_postmeta.post_id,
	wpst_posts.post_title,
	wpst_posts.post_type,
	x.views,
	x.viewcount,
	ABS(x.viewcount-x.views) AS difference
FROM wpst_posts
     INNER JOIN (select post_id,
                        max(case meta_key
                              when 'views' then meta_value
                              else null
                            end) views,
                        max(case meta_key
                             when 'viewcount' then meta_value
                             else null
                            end) viewcount
                  from wpst_postmeta
                  where meta_key in ('views', 'viewcount')
                  group by post_id) x
             on x.post_id = wpst_posts.post_id
  • Partager sur Facebook
  • Partager sur Twitter