Mysql
 sql >> база данни >  >> RDS >> Mysql

Получавайте WP публикации на базата на множество двойки мета ключ/стойност, използвайки IN

Трябва да се присъедините към post_meta маса два пъти. Ето малко теория на базата данни.

Когато присъедините таблици, на теория временна таблица съдържа всички елементи от първата таблица, комбинирани с всички елементи от втората таблица, се създава и филтрира. Така че, ако например имате само 1 мета елемент на публикация и имате 3 публикации, тогава имате

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

и

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

А "теоретичната" временна обединена таблица е:

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

След това казвате:WHERE p.id =pm.post_id

и това филтрира временната таблица да бъде:

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

Така че имате само един ред за всяка публикация + мета стойност. Заявката ви иска редове, които имат и двата meta_key = category и meta_key =book_genre`, които не съществуват.

Така че имате нужда от таблица, която се присъединява към postmeta таблица в TWICE.

Можете да направите това, като поставите псевдоним на таблицата, докато се присъединявате към тях. Извинете за опростяването:

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

Тук имате две свързани копия на postmeta таблицата с псевдоним на pm1 и pm2 (тъй като и ДВЕТЕ не могат да бъдат наречени wp_postmeta в заявката.

След това можете да поискате:

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

Надяваме се, че можете да зашиете останалото от това.

Също така мисля, че можете да направите това с WP_Query, ако искате да отидете по този път.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP как да запазите HTML низ в база данни

  2. Изберете данни между диапазон от дата/час

  3. java.sql.SQLException:Индексът на колоната е извън обхвата, 0 <1

  4. PHP PDO програмиране на клас:Фатална грешка:Извикване на член функция fetchAll() на булева

  5. Най-добрият начин за съхраняване на подредени списъци в база данни?