sql >> Databáze >  >> RDS >> Mysql

Získejte příspěvky WP založené na několika meta párech klíč/hodnota pomocí IN

Musíte se připojit k post_meta stůl dvakrát. Zde je nějaká teorie databáze.

Když spojíte tabulky, teoreticky se vytvoří a filtruje dočasná tabulka obsahující všechny položky z první tabulky v kombinaci se všemi položkami z druhé tabulky. Takže pokud máte například pouze 1 meta položku na příspěvek a máte 3 příspěvky, pak máte

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

a

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

A "teoretická" dočasně spojená tabulka je:

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

Potom řeknete:WHERE p.id =pm.post_id

a to filtruje dočasnou tabulku na:

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

Máte tedy pouze jeden řádek pro každý příspěvek + meta hodnotu. Váš dotaz požaduje řádky, které mají oba meta_key = category a meta_key =book_genre` které neexistují.

Potřebujete tedy tabulku, která spojuje postmeta tabulka DVAKRÁT.

Můžete to udělat aliasem tabulky, když se k nim připojíte. Promiňte mi zjednodušení:

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

Zde máte dvě spojené kopie postmeta tabulky s aliasem pm1 a pm2 (protože nemohou být OBA nazývány wp_postmeta v dotazu.

Poté můžete požádat o:

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

Doufejme, že z toho dokážete sešít zbytek.

Také si myslím, že to můžete udělat pomocí WP_Query, pokud chcete jít touto cestou.




  1. Jak funguje Log() v PostgreSQL

  2. Práce s jazykem SQL (Structured Query Language) pomocí Microsoft Access 2010, 2013, 2016 a 2019

  3. XML Server Optimalizace výkonu XML

  4. co je java.io.EOFEException, Zpráva:Nelze přečíst odpověď ze serveru. Očekává se čtení 4 bajtů, čtení 0 bajtů