Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Uzyskaj posty WP oparte na wielu parach meta klucz/wartość za pomocą IN

Musisz dołączyć do post_meta stół dwa razy. Oto trochę teorii na temat baz danych.

Kiedy łączysz tabele, teoretycznie tworzona i filtrowana jest tabela tymczasowa zawierająca wszystkie elementy z pierwszej tabeli połączone ze wszystkimi elementami z drugiej tabeli. Więc jeśli na przykład masz tylko 1 element meta na post, a masz 3 posty, to masz

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

i

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

A „teoretyczna” tymczasowa tabela połączona to:

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

Następnie mówisz:GDZIE p.id =pm.post_id

a to odfiltruje tymczasową tabelę tak, aby była:

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

Więc masz tylko jeden wiersz na każdy post + wartość meta. Twoje zapytanie wymaga wierszy, które mają zarówno meta_key = category i meta_key =book_genre` które nie istnieją.

Potrzebujesz więc tabeli, która łączy postmeta stół za DWA RAZY.

Możesz to zrobić, tworząc alias tabeli podczas dołączania. Wybacz uproszczenie:

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

Tutaj masz dwie połączone kopie tabeli postmeta z aliasem pm1 i pm2 (ponieważ OBYDWA nie mogą być nazwane wp_postmeta w zapytaniu.

Następnie możesz poprosić o:

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

Mam nadzieję, że uda Ci się połączyć resztę z tego.

Myślę też, że możesz to zrobić za pomocą WP_Query, jeśli chcesz iść tą drogą.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zmienić nazwę schematu MySQL?

  2. laravel 4 - jak ograniczyć (przejmowanie i pomijanie) dla elokwentnego ORM?

  3. Aktualizacja MySQL lub zmiana nazwy klucza w JSON

  4. MySQL nie obsługuje tutaj komentarzy jednowierszowych. Jaki byłby powód?

  5. Jak wykonać kopię zapasową zaszyfrowanej bazy danych za pomocą serwera Percona Server dla MySQL 8.0?