sql >> Database teknologi >  >> RDS >> Mysql

Få WP-indlæg baseret på flere meta-nøgle/værdi-par ved hjælp af IN

Du skal tilmelde dig post_meta bord to gange. Her er noget databaseteori.

Når du forbinder tabeller, er der i teorien oprettet og filtreret en midlertidig tabel alle elementerne fra den første tabel kombineret med alle elementerne fra den anden tabel. Så hvis du for eksempel kun har 1 meta-element pr. indlæg, og du har 3 indlæg, så har du

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

og

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

Og den "teoretiske" midlertidigt sammenføjede tabel er:

+---------+------------+----------+----------+-----------+-------------+ |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 siger så:HVOR p.id =pm.post_id

og dette filtrerer den midlertidige tabel til at være:

+---------+------------+----------+----------+-----------+-------------+ |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 kun én række for hvert indlæg + metaværdi. Din forespørgsel beder om rækker, der både har meta_key = category og meta_key =boggenre`, som ikke eksisterer.

Så du har brug for en tabel, der forbinder postmeta tabel i TO GANGE.

Du kan gøre dette ved at aliasere tabellen, når du slutter dig til dem. Tilgiv mig for at forenkle:

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
 

Her har du to sammenlagte kopier af postmeta-tabellen kaldet pm1 og pm2 (da de ikke BEGGE kan kaldes wp_postmeta i forespørgslen.

Du kan derefter bede om:

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

Forhåbentlig kan du sy resten af ​​det sammen.

Jeg tror også, du kan gøre dette med WP_Query, hvis du vil gå den vej.




  1. Kan ikke indlæse com.mysql.jdbc.Driver

  2. Entity Developer og ADO.Net Data Providers understøtter nu Entity Framework Core 5

  3. CURRENT_DATE/CURDATE() fungerer ikke som standardværdi for DATE

  4. Dvale OneToOne doven indlæsning og cascading