2009-02-16 94 views
3

我已經開發了一個網站的分類,我一直在努力,可能會濫用WordPress的分類系統 - 職位是根據他們所指的主題歸類(比方說,貓,狗,猴子)以及它是什麼類型的職位(比如專家,組織,文章)。所以我想找到所有關於貓狗的帖子,這些是組織。 IN(貓,狗)和IN(組織)中的某些東西......至少它對我來說意義重大,但我無法弄清楚任務的正確SQL語法。自定義mysql選擇語句爲wordpress

根據我在this article on wordpress.com中找到的內容,我從下面的查詢中構建...但我不確定如何說'我想要的屬於(類別1或2 )和(屬於類別3)(例如,貓1 =貓,2 =狗,3 =組織)。

這可能很簡單,當我得到回覆時我會踢自己。

SELECT * FROM $wpdb->posts 
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id) 
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id) 
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id) 
WHERE $wpdb->term_taxonomy.term_id = 1,2,3 
AND $wpdb->term_taxonomy.taxonomy = 'category' 
AND $wpdb->posts.post_status = 'publish' 
ORDER BY $wpdb->postmeta.meta_value ASC 

謝謝!

回答

1

由於term_taxonomy表的不同行上存在兩個條件,因此您必須連接到該表兩次以便在結果集的一行中進行比較。

另外我不認爲你需要使用LEFT JOIN,因爲你在WHERE子句中使用條件。外連接通常比內連接慢。

您可以使用表別名,因此您不必一直重複變量表名稱。

,所以我沒有測試,但你需要滿足以下條件應更貼近:

SELECT * FROM $wpdb->posts p 
INNER JOIN $wpdb->postmeta m ON (p.ID = m.post_id) 
INNER JOIN $wpdb->term_relationships r1 ON (p.ID = r1.object_id) 
INNER JOIN $wpdb->term_taxonomy x1 
    ON (r1.term_taxonomy_id = x1.term_taxonomy_id) 
INNER JOIN $wpdb->term_relationships r2 ON (p.ID = r2.object_id) 
INNER JOIN $wpdb->term_taxonomy x2 
    ON (r2.term_taxonomy_id = x2.term_taxonomy_id) 
WHERE x1.term_id IN (1, 2) AND x1.taxonomy = 'category' 
AND x2.term_id = 3 AND x2.taxonomy = 'category' 
AND p.post_status = 'publish' 
ORDER BY m.meta_value ASC 
+0

真棒;像魅力一樣工作。我添加了「GROUP BY p.id」,因此不會返回重複的帖子。謝謝! – bennettk 2009-02-16 21:10:46