Wordpress SQL - danh mục bài đăng và thẻ

Sep 02 2020

Tôi đã sử dụng truy vấn này, để nhận các bài đăng với danh mục và thẻ của anh ấy.

SELECT
    p.id,
    p.post_name,
    c.name,
    GROUP_CONCAT(t.`name`)
FROM wp_posts p
JOIN wp_term_relationships cr
    on (p.`id`=cr.`object_id`)
JOIN wp_term_taxonomy ct
    on (ct.`term_taxonomy_id`=cr.`term_taxonomy_id`
    and ct.`taxonomy`='category')
JOIN wp_terms c on
    (ct.`term_id`=c.`term_id`)
JOIN wp_term_relationships tr
    on (p.`id`=tr.`object_id`)
JOIN wp_term_taxonomy tt
    on (tt.`term_taxonomy_id`=tr.`term_taxonomy_id`
    and tt.`taxonomy`='post_tag')
JOIN wp_terms t
    on (tt.`term_id`=t.`term_id`)
GROUP BY p.id

Đó là từ Wordpress SQL: lấy danh mục bài đăng và thẻ

Nhưng tôi có một vấn đề, truy vấn bỏ qua các bài đăng không có thẻ . Tôi đã thử nhiều truy vấn khác nhưng không có SUCSSES. Ai đó có thể giúp tôi?

Trả lời

1 O.Jones Sep 02 2020 at 02:16

Bạn đang ở rất gần một giải pháp tốt cho vấn đề của mình.

Một người trả lời khác đã đề cập điều này: Sử dụng LEFT JOIN. Tại sao? Bên trong thông thường JOINloại bỏ các hàng từ bảng đầu tiên không khớp với các hàng từ bảng thứ hai.

Mã của bạn cũng có dấu hiệu lạm dụng phần mở rộng khét tiếng của MySQL cho GROUP BY . Nếu bạn nói

   SELECT id, name, value
     FROM tbl
    GROUP BY id, name

bạn đang thực sự nói

  SELECT id, name, ANY_VALUE(value)
    FROM tbl
   GROUP BY id, name

Nói cách khác, máy chủ chọn bất cứ thứ gì valuenó muốn từ trong nhóm. Bạn nên sử dụng kết quả tổng hợp có thể dự đoán được như MAX(value)hoặc GROUP_CONCAT(value). Phiên bản 8 của MySQL và các phiên bản và mô hình khác của máy chủ bảng SQL từ chối cú pháp bạn sử dụng.

Mẹo chuyên nghiệp vì lợi ích của sự tỉnh táo của bạn là không sử dụng dấu gạch ngược xung quanh tên bảng hoặc cột trừ khi chúng là các từ dành riêng trong SQL. Và, mẹo chuyên nghiệp , không sử dụng các từ dành riêng cho tên bảng hoặc cột.

Sử dụng truy vấn này thay thế.

SELECT
    p.id,
    p.post_name,
    GROUP_CONCAT(c.name ORDER BY c.name) categories,
    GROUP_CONCAT(t.name ORDER BY t.name) tags
FROM wp_posts p
LEFT JOIN wp_term_relationships cr
    on (p.id=cr.object_id)
LEFT JOIN wp_term_taxonomy ct
    on (ct.term_taxonomy_id=cr.term_taxonomy_id
    and ct.taxonomy='category')
LEFT JOIN wp_terms c on
    (ct.term_id=c.term_id)
LEFT JOIN wp_term_relationships tr
    on (p.id=tr.object_id)
LEFT JOIN wp_term_taxonomy tt
    on (tt.term_taxonomy_id=tr.term_taxonomy_id
    and tt.taxonomy='post_tag')
LEFT JOIN wp_terms t
    on (tt.term_id=t.term_id)
GROUP BY p.id, p.post_name
2 Atif Sep 02 2020 at 01:49

Tất cả các phép nối của bạn đều là các phép nối bên trong nên nếu dữ liệu không khớp trong bất kỳ một bảng nào thì dữ liệu đó sẽ không được tìm nạp.

Thay đổi liên kết bên trong của bạn thành liên kết ngoài trái / phải.