Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erhalten Sie WP-Beiträge basierend auf mehreren Meta-Schlüssel/Wert-Paaren mit IN

Sie müssen dem post_meta beitreten Tisch zweimal. Hier ist etwas Datenbanktheorie.

Wenn Sie Tabellen zusammenführen, wird theoretisch eine temporäre Tabelle erstellt und gefiltert, die alle Elemente der ersten Tabelle kombiniert mit allen Elementen der zweiten Tabelle enthält. Wenn Sie also zum Beispiel nur 1 Meta-Element pro Post haben und 3 Posts haben, dann haben Sie

+-------+----------+
|post_id|post_title|
+-------+----------+
|   1   | 'Post 1' |
|   2   | 'Post 2' |
|   3   | 'Post 3' |
+-------+----------+

und

+-------+----------+----------+------------+
|meta_id| post_id  | meta_key | meta_value |
+-------+----------+----------+------------+
|   10  | 1        |  k1      | v1         |
|   11  | 2        |  k1      | v2         |
|   12  | 3        |  k1      | v3         |
+-------+----------+----------+------------+

Und die "theoretische" temporäre verbundene Tabelle ist:

+---------+------------+----------+----------+-----------+-------------+
|p.post_id|p.post_title|pm.meta_id|pm.post_id|pm.meta_key|pm.meta_value|
+---------+------------+----------+----------+-----------+-------------+
|   1     | 'Post 1'   |   10     | 1        |  k1       | v1          |
|   1     | 'Post 1'   |   11     | 2        |  k1       | v2          |
|   1     | 'Post 1'   |   12     | 3        |  k1       | v3          |
|   2     | 'Post 2'   |   10     | 1        |  k1       | v1          |
|   2     | 'Post 2'   |   11     | 2        |  k1       | v2          |
|   2     | 'Post 2'   |   12     | 3        |  k1       | v3          |
|   3     | 'Post 3'   |   10     | 1        |  k1       | v1          |
|   3     | 'Post 3'   |   11     | 2        |  k1       | v2          |
|   3     | 'Post 3'   |   12     | 3        |  k1       | v3          |
+---------+------------+----------+----------+-----------+-------------+

Sie sagen dann:WHERE p.id =pm.post_id

und dies filtert die temporäre Tabelle wie folgt:

+---------+------------+----------+----------+-----------+-------------+
|p.post_id|p.post_title|pm.meta_id|pm.post_id|pm.meta_key|pm.meta_value|
+---------+------------+----------+----------+-----------+-------------+
|   1     | 'Post 1'   |   10     | 1        |  k1       | v1          |
|   2     | 'Post 2'   |   11     | 2        |  k1       | v2          |
|   3     | 'Post 3'   |   12     | 3        |  k1       | v3          |
+---------+------------+----------+----------+-----------+-------------+

Sie haben also nur eine Zeile für jeden Beitrag + Metawert. Ihre Abfrage fragt nach Zeilen, die beide meta_key = category haben und meta_key =book_genre`, die nicht existieren.

Sie brauchen also eine Tabelle, die sich der postmeta anschließt Tabelle ZWEIMAL.

Sie können dies tun, indem Sie den Tisch aliasieren, wenn Sie ihm beitreten. Entschuldigen Sie die Vereinfachung:

SELECT wp_posts.*, pm1.*, pm2.*
FROM
  wp_posts
  wp_postmeta as pm1
  wp_postmeta as pm2
WHERE pm1.post_id = wp_posts.ID
  AND pm2.post_id = wp_posts.ID
  AND ...etc

Hier haben Sie zwei verbundene Kopien der Postmeta-Tabelle mit dem Alias ​​pm1 und pm2 (da sie nicht BEIDE wp_postmeta heißen können in der Abfrage.

Sie können dann fragen nach:

AND pm1.meta_key = 'category'
AND pm1.meta_value = X
AND pm2.meta_key = 'book_genre'
AND pm2.meta_key IN (123,456)

Hoffentlich kannst du den Rest daraus zusammennähen.

Ich denke auch, dass Sie dies mit WP_Query tun können, wenn Sie diesen Weg gehen möchten.