sql >> Database >  >> RDS >> Mysql

Ontvang WP-berichten op basis van meerdere metasleutel/waarde-paren met IN

Je moet lid worden van de post_meta twee keer tafelen. Hier is wat databasetheorie.

Wanneer u tabellen samenvoegt, wordt in theorie een tijdelijke tabel gemaakt en bevat alle items uit de eerste tabel gecombineerd met alle items uit de tweede tabel. Dus als je bijvoorbeeld maar 1 meta-item per bericht hebt en je hebt 3 berichten, dan heb je

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

en

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

En de "theoretische" tijdelijke samengevoegde tabel is:

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

Je zegt dan:WHERE p.id =pm.post_id

en dit filtert de tijdelijke tabel als:

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

Je hebt dus maar één rij voor elke post + metawaarde. Uw zoekopdracht vraagt ​​om rijen die zowel meta_key = category . hebben en meta_key =book_genre` die niet bestaan.

Je hebt dus een tabel nodig die aansluit bij de postmeta tabel in TWEE KEER.

U kunt dit doen door de tabel een alias te geven terwijl u zich bij hen voegt. Vergeef me voor het vereenvoudigen:

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

Hier heb je twee samengevoegde exemplaren van de postmeta-tabel met de alias pm1 en pm2 (omdat ze niet BEIDE wp_postmeta kunnen heten in de zoekopdracht.

U kunt dan vragen om:

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

Hopelijk kun je de rest daaruit aan elkaar naaien.

Ik denk ook dat je dit met WP_Query kunt doen als je die weg wilt gaan.




  1. Utf-8-gecodeerde tekst in MySQL-tabel laden

  2. Willekeurige rijen selecteren via JPA

  3. Back-ups van verschillende instanties controleren

  4. MySQL - Hoe zoek ik naar exacte woordovereenkomst met LIKE?