Abfrage, die die Postmeta-Tabelle zweimal verbindet

Ich glaube, was ich versuche, ist zu komplex für den Standardmeta_query-Parameter in get_posts versuche ich, eine benutzerdefinierte SQL-Abfrage zu verwenden, um Folgendes zu tun:

Ich habe einen benutzerdefinierten Spielpost, der benutzerdefinierte Felder für Team1 und Team2 als postmeta gespeichert hat. Bei Team XXXX muss ich alle Posts mit dem postmeta-Wert XXXX für postmeta key team1 oder postmeta key team2 ziehen.

Ich muss auch das Jahr berücksichtigen, weil 2 Teams jedes Jahr gegeneinander spielen können. Das Jahr für den Spielpost-Typ wird als Post-Jahr gespeichert.

Ich habe versucht, Folgendes zu verwenden (Testen in phpmyadmin) und es funktioniert nicht …

Meine zwei Variablen hier wären Jahr = 2014 und Team = Yankees:

 SELECT DISTINCT (p.ID), p.post_title FROM wp_posts p JOIN wp_postmeta pm1 ON p.ID = pm1.post_id JOIN wp_postmeta pm2 ON p.ID = pm2.post_id WHERE 1 =1 AND p.post_type = 'game' AND ((pm1.meta_key = 'year' AND pm1.meta_value = '2014' AND pm2.meta_key = 'team1' AND pm2.meta_value = 'yankees') OR (pm1.meta_key = 'year' AND pm1.meta_value = '2014' AND pm2.meta_key = 'team2' AND pm2.meta_value = 'yankees')) 

Solutions Collecting From Web of "Abfrage, die die Postmeta-Tabelle zweimal verbindet"

“Mein SQL funktioniert nicht” – Fragen sind schwierig, weil sie ohne den Datensatz des OP fast nicht testbar sind, aber …

Ich denke, Sie machen das vielleicht zu kompliziert.

 SELECT DISTINCT (p.ID), p.post_title FROM wp_posts p JOIN wp_postmeta pm1 ON p.ID = pm1.post_id JOIN wp_postmeta pm2 ON p.ID = pm2.post_id WHERE 1 = 1 AND p.post_type = 'game' AND ( pm1.meta_key = 'year' AND pm1.meta_value = '2014' ) AND ( pm2.meta_key IN ('team1','team2') AND pm2.meta_value = 'yankees' ) 

Ich denke, dass das tun kann, was Sie brauchen. Und ja, ich bin mir ziemlich sicher, dass Sie das mit WP_Query direkt machen können, aber …

 function swap_key_wpse_144950($where) { remove_filter('posts_where','swap_key_wpse_144950'); $where = str_replace("= 'xxteamsxx'"," IN ('team1','team2')",$where); return $where; } add_filter('posts_where','swap_key_wpse_144950'); $args = array( 'meta_query' => array( array( 'key' => 'year', 'value' => '2014' ), array( 'key' => 'xxteamsxx', 'value' => 'yankees' ) ) ); $q = new WP_Query($args); var_dump($q->request); 

Könnten Sie versuchen, diese Abfrage als zu schreiben

 SELECT DISTINCT (p.ID), p.post_title FROM wp_posts p left outer join wp_postmeta pm1 ON p.ID = pm1.post_id AND pm1.meta_key = 'team1' and pm1.meta_value = 'yankees' left outer join wp_postmeta pm2 ON p.ID = pm2.post_id and pm2.meta_key = 'team2' and pm2.meta_value = 'yankees' left outer join wp_postmeta pm on p.ID= pm.post_id and pm.meta_key = 'year' and pm.meta_value = '2014' WHERE p.post_type = 'game' 

Sie müssen die Bedingung nicht mit 1 = 1 angeben, da Sie viele andere where-Klauseln haben (brauchen keine gefälschten). Lass mich das Ergebnis wissen

BEARBEITEN

Was ist mit diesem

 SELECT DISTINCT (p.ID), p.post_title FROM wp_posts p left outer join wp_postmeta pm1 ON p.ID = pm1.post_id AND pm1.meta_key = 'team1' left outer join wp_postmeta pm2 ON p.ID = pm2.post_id and pm2.meta_key = 'team2' left outer join wp_postmeta pm on p.ID= pm.post_id and pm.meta_key = 'year' WHERE p.post_type = 'game' and pm.meta_value = '2014' and (pm1.meta_value = 'yankees' or pm2.meta_value = 'yankees')