sql >> Databasteknik >  >> RDS >> Mysql

Få WP-inlägg baserade på flera meta-nyckel/värdepar med IN

Du måste gå med i post_meta bord två gånger. Här är lite databasteori.

När du sammanfogar tabeller, i teorin, en temporär tabell innehåller alla objekt från den första tabellen kombinerat med alla objekt från den andra tabellen skapas och filtreras. Så om du till exempel bara har 1 metaobjekt per inlägg och du har 3 inlägg så har du

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

och

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

Och den "teoretiska" tillfälligt sammanfogade tabellen är:

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

Du säger då:WHERE p.id =pm.post_id

och detta filtrerar den tillfälliga tabellen till att vara:

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

Så du har bara en rad för varje inlägg + metavärde. Din fråga frågar efter rader som har både meta_key = category och meta_key =book_genre` som inte finns.

Så du behöver en tabell som ansluter till postmeta tabell i TVÅ GANGER.

Du kan göra detta genom att aliasera tabellen när du går med i dem. Ursäkta att jag förenklar:

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

Här har du två sammanfogade kopior av postmetatabellen alias till pm1 och pm2 (eftersom de inte kan BÅDA kallas wp_postmeta i frågan.

Du kan sedan be om:

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

Förhoppningsvis kan du sy ihop resten av det.

Jag tror också att du kan göra detta med WP_Query om du vill gå den vägen.




  1. MySQL Aggregate-funktioner utan GROUP BY-sats

  2. Hur ansluter jag till MySQL 5.1 i Visual Studio 2010?

  3. Bästa praxis/standard för att lagra en adress i en SQL-databas

  4. Inte unik tabell/alias