sql >> Base de Datos >  >> RDS >> Mysql

Obtenga publicaciones de WP basadas en múltiples pares meta clave/valor usando IN

Debes unirte al post_meta mesa dos veces. Aquí hay algo de teoría de bases de datos.

Cuando une tablas, en teoría se crea y filtra una tabla temporal que contiene todos los elementos de la primera tabla combinados con todos los elementos de la segunda tabla. Entonces, si, por ejemplo, solo tiene 1 metaelemento por publicación y tiene 3 publicaciones, entonces tiene

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

y

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

Y la tabla unida temporal "teórica" ​​es:

+---------+------------+----------+----------+-----------+-------------+
|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          |
+---------+------------+----------+----------+-----------+-------------+

Luego dices:WHERE p.id =pm.post_id

y esto filtra la tabla temporal para ser:

+---------+------------+----------+----------+-----------+-------------+
|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          |
+---------+------------+----------+----------+-----------+-------------+

Por lo tanto, solo tiene una fila para cada publicación + valor meta. Su consulta solicita filas que tengan ambas meta_key = category y meta_key =book_genre` que no existen.

Entonces necesitas una tabla que se una al postmeta mesa en TWICE.

Puede hacer esto creando un alias en la tabla a medida que se une a ellos. Perdóname por simplificar:

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

Aquí tienes dos copias unidas de la tabla postmeta con alias pm1 y pm2 (ya que AMBOS no pueden llamarse wp_postmeta en la consulta.

A continuación, puede solicitar:

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

Con suerte, puedes unir el resto de eso.

También creo que puedes hacer esto con WP_Query si quieres ir por ese camino.