2012-02-12 27 views
6

Truy vấn bài viết wordpress theo thẻ của họ có thể trông như thế này (nếu tôi chắp lại với nhau một cách chính xác - Tôi đã gỡ bỏ phần không liên quan từ các truy vấn):Lọc bài viết nào trong một truy vấn nếu họ chỉ có một thẻ nào đó

SELECT wposts.ID AS ID, 
wposts.post_title, wposts.post_status, wposts.post_name, 
tag_terms.term_id AS tag_id 

FROM `wp_posts` AS wposts 

INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 

WHERE wposts.ID = '12345' 

AND wposts.post_type = 'post' 

AND wposts.post_status NOT LIKE 'private' 

AND tag_terms.term_id = '55' 

GROUP BY wposts.ID 
ORDER BY wposts.post_date ASC 

Điều này sẽ truy vấn tất cả các bài đăng có id thẻ 55.

Điều tôi cần làm là lọc ra tất cả các bài đăng chỉ chứa thẻ duy nhất này, nhưng không có thẻ nào khác.

Vì vậy, tôi muốn hiển thị bài đăng nếu có thẻ 23,34,55,67 Nhưng tôi không muốn hiển thị bài đăng nếu thẻ có thẻ 55 (và không có thẻ nào khác). Bài đăng không chứa thẻ nhất định này cũng phải được bao gồm trong truy vấn.

Làm cách nào để thực hiện việc này?

+1

bạn làm sai. bạn nên luôn luôn chọn bài viết với lớp WP_query: http://codex.wordpress.org/Class_Reference/WP_Query – janw

+1

Tôi đồng ý với @janw, trừ khi bạn đang phát triển plugin của riêng bạn, bạn không cần phải viết một câu lệnh SELECT, . – twilson

+1

Vô nghĩa. Tôi cần truy vấn một số giá trị meta, hình thu nhỏ, tên người dùng và thẻ, tất cả trong cùng một truy vấn. WP_Query là dành cho núm vú giả và không cho phép sự linh hoạt mà tôi cần. – reggie

Trả lời

4

Hãy thử thêm HAVING điều kiện giữa GROUP BYORDER BY:

... 
GROUP BY wposts.ID 
HAVING COUNT(tag_terms.term_id) <> 1 
    OR MAX(tag_terms.term_id) <> 55 
ORDER BY wposts.post_date ASC 

và thay đổi điều kiện WHERE bạn để kiểm tra chỉ dành cho bài loại và trạng thái.

Ngoài ra nếu bạn không chọn bất cứ điều gì khác hơn tag_id từ wp_terms tham gia nó là không cần thiết vì bạn chỉ có thể sử dụng term_id từ wp_term_taxonomy.

+0

Cảm ơn. Tôi chưa bao giờ nghe nói đến mệnh đề HAVING. – reggie

+0

uh ?? làm thế nào có thể làm việc này, chọn 'tag_terms.term_id' và sử dụng nó trong việc có điều khoản cùng một lúc - tôi đang thiếu cái gì ?? – Aprillion

+0

Không có lựa chọn nào ở đây, chúng tôi không biết OP muốn chọn gì, nếu anh ta muốn các thẻ anh ấy có thể sử dụng GROUP_CONCAT trên tên hoặc tham gia lại các điều khoản sau khi lọc ra các bài đăng không cần thiết. Truy vấn trong câu hỏi là một câu hỏi hoàn toàn khác, với một mục đích khác. – piotrm

1

Nếu bạn muốn tất cả các bài đăng có một thẻ nhất định, thì tại sao bạn chỉ định ID bài đăng trong truy vấn?

truy vấn sau này sẽ hiển thị tất cả các bài viết với từ khóa id cho

SELECT wposts.ID AS ID, 
wposts.post_title, wposts.post_status, wposts.post_name, 
tag_terms.term_id AS tag_id 

FROM `wp_posts` AS wposts 

INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 


WHERE wposts.post_type = 'post' 

AND wposts.post_status NOT LIKE 'private' 

AND tag_terms.term_id = '55' 

GROUP BY wposts.ID 
ORDER BY wposts.post_date ASC 

Bây giờ, nếu bạn muốn chắc chắn rằng những bài viết chỉ có thẻ id nhất định, tổ truy vấn như sau:

SELECT wposts.ID AS ID, 
    wposts.post_title, wposts.post_status, wposts.post_name, 
    tag_terms.term_id AS tag_id 

    FROM `wp_posts` AS wposts 

    INNER JOIN wp_term_relationships AS tag_term_relationships ON (wposts.ID = tag_term_relationships.object_id) 
    INNER JOIN wp_term_taxonomy AS tag_term_taxonomy ON (tag_term_relationships.term_taxonomy_id = tag_term_taxonomy.term_taxonomy_id AND tag_term_taxonomy.taxonomy = 'post_tag') 
    INNER JOIN wp_terms AS tag_terms ON (tag_term_taxonomy.term_id = tag_terms.term_id) 


    WHERE wposts.post_type = 'post' 

    AND wposts.post_status NOT LIKE 'private' 

    AND tag_terms.term_id = '55' 

    GROUP BY wposts.ID 
    HAVING COUNT(tag_terms.term_id) <> 1 
    OR MAX(tag_terms.term_id) <> 55  
    ORDER BY wposts.post_date ASC 
Các vấn đề liên quan