Mysql
 sql >> Database >  >> RDS >> Mysql

Ottieni post WP basati su più coppie meta chiave/valore usando IN

Devi unirti a post_meta tavola due volte. Ecco un po' di teoria dei database.

Quando si uniscono tabelle, in teoria viene creata e filtrata una tabella temporanea contenente tutti gli elementi della prima tabella combinati con tutti gli elementi della seconda tabella. Quindi, se, ad esempio, hai solo 1 meta elemento per post e hai 3 post, allora hai

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

e

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

E la tabella unita temporanea "teorica" ​​è:

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

Quindi dici:DOVE p.id =pm.post_id

e questo filtra la tabella temporanea in modo che sia:

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

Quindi hai solo una riga per ogni post + meta valore. La tua query richiede righe che hanno entrambi meta_key = category e meta_key =book_genre` che non esistono.

Quindi hai bisogno di una tabella che si unisca al postmeta tabella in DUE VOLTE.

Puoi farlo assegnando un alias al tavolo quando ti unisci a loro. Perdonami se ti semplifico:

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

Qui hai due copie unite della tabella postmeta alias pm1 e pm2 (poiché non possono ENTRAMBI essere chiamati wp_postmeta nella query.

Puoi quindi chiedere:

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

Spero che tu possa cucire insieme il resto da quello.

Penso anche che tu possa farlo con WP_Query se vuoi seguire quella strada.