Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhận các bài đăng WP dựa trên nhiều cặp khóa / giá trị meta bằng cách sử dụng IN

Bạn cần tham gia post_meta bảng hai lần. Đây là một số lý thuyết về cơ sở dữ liệu.

Khi bạn nối các bảng, về lý thuyết, một bảng tạm thời chứa tất cả các mục từ bảng đầu tiên kết hợp với tất cả các mục từ bảng thứ hai sẽ được tạo và lọc. Vì vậy, ví dụ:nếu bạn chỉ có 1 meta item cho mỗi bài đăng và bạn có 3 bài viết thì bạn có

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

Và bảng kết hợp tạm thời "lý thuyết" là:

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

Sau đó, bạn nói:WHERE p.id =pm.post_id

và điều này lọc bảng tạm thời thành:

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

Vì vậy, bạn chỉ có một hàng cho mỗi bài đăng + giá trị meta. Truy vấn của bạn đang yêu cầu các hàng có cả meta_key = category và meta_key =book_genre` không tồn tại.

Vì vậy, bạn cần một bảng tham gia postmeta bảng trong TWICE.

Bạn có thể thực hiện việc này bằng cách đặt bí danh cho bảng khi tham gia cùng với chúng. Thứ lỗi cho tôi vì đã đơn giản hóa:

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

Ở đây bạn có hai bản sao đã kết hợp của bảng postmeta được đặt bí danh là pm1pm2 (vì chúng không thể được gọi là CẢ wp_postmeta trong truy vấn.

Sau đó, bạn có thể yêu cầu:

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

Hy vọng rằng bạn có thể ghép những phần còn lại từ đó lại với nhau.

Tôi cũng nghĩ rằng bạn có thể làm điều này với WP_Query nếu bạn muốn đi theo con đường đó.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn MySQL cho giờ GMT hiện tại

  2. Kiến trúc bảo mật:Hướng dẫn cho MySQL

  3. SubSonic 3 và MySQL, xóa dấu gạch dưới khỏi tên cột trong phương thức CleanUp () gây ra ngoại lệ khi sử dụng thuộc tính trong truy vấn linq

  4. Làm cách nào để thực hiện time_to_minute trong Mysql?

  5. Ghép kênh php / Mysql Hành vi số học thời gian