2009-11-01 9 views
0

Parfois, je pense que je n'ai pas la puissance du cerveau pour la programmation, je ne peux tout simplement pas comprendre.Requête MySQL compliquée pour Wordpress

J'ai une table appelée wp_postmeta qui ressemble un peu comme ce

+-----------+-----------+------------+--------------+ 
| meta_id | post_id | meta_key | meta_value | 
+-----------+-----------+------------+--------------+ 
| 1  |  1  | type  | movie  | 
+-----------+-----------+------------+--------------+ 
| 2  |  1  | name  | dark knight | 
+-----------+-----------+------------+--------------+ 
| 3  |  2  | type | tv show | 
+-----------+-----------+------------+--------------+ 
| 4  |  2  | name | lost  | 
+-----------+-----------+------------+--------------+ 
| 5  |  3  | type | tv show | 
+-----------+-----------+------------+--------------+ 
| 6  |  3  | name  | house  | 
+-----------+-----------+------------+--------------+ 
| 7  |  4  | type  | movie  | 
+-----------+-----------+------------+--------------+ 
| 8  |  4  | name  | godfather | 
+-----------+-----------+------------+--------------+ 

Ce que je veux faire est de sélectionner les tous les films. Je dois trouver WHERE meta_key = 'type' AND meta_value = 'movie' puis obtenir la meta_key "nom" où correspond le post_id et sélectionnez la meta_value me donnant ainsi "dark knight" et "parrain".

Désolé pour la mauvaise explication, mais WordPress n'a pas de structure logique pour cette partie de la base de données, ce qui rend l'explication assez difficile.

Répondre

3
select pm2.meta_value as movie_name 
    from wp_postmeta as pm1 join wp_postmeta as pm2 
    on pm1.post_id = pm2.post_id 
    where pm1.meta_key = 'type' and pm1.meta_value = 'movie' and 
    pm2.meta_key = 'name' 
+0

Les joints me font mal à la tête, merci. –

0
SELECT meta_value FROM wp_postmeta WHERE meta_key = 'name' AND post_id IN 
    (SELECT post_id FROM wp_postmeta 
    WHERE meta_key = 'type' AND meta_value = 'movie'); 
0
SELECT b.meta_value as movie 
FROM wp_postmeta a 
LEFT JOIN wp_postmeta b ON (a.post_id = b.post_id) 
WHERE a.meta_key = 'type' 
    AND a.meta_value = 'movie' 
    AND b.meta_key = 'name'; 
+0

Pourquoi "LEFT JOIN" au lieu de "JOIN"? Y a-t-il une différence? –

+0

J'utilise LEFT JOIN dans mon propre code pour que je puisse vérifier les données renvoyées à partir de la requête, ce que j'attendrais, et aussi utile pour trouver des données orphelines, ie où le message est un film, mais la clé de nom n'a pas été définir ou a été supprimé. Dans ce cas, JOIN ou LEFT JOIN est approprié. –

0

est ici une légère variante de Amyam de la jointure où est implicite. Je l'ai appris de cette façon il y a longtemps, donc c'est probablement la façon démodée:

select pm2.meta_value as movie_name 
from wp_postmeta pm1, wp_postmeta pm2 
where pm1.post_id = pm2.post_id AND 
     pm1.meta_key = 'type' AND pm1.meta_value = 'movie' AND 
     pm2.meta_key = 'name'; 
+0

Vieux mais fonctionne parfaitement;) –