2012-04-27 191 views
0

我使用三類複選框來過濾來自WordPress的帖子(這個問題是關於查詢的),我知道一個事實,我應該返回結果與以下查詢(我生成第7行自動依據是什麼在我的過濾器中選擇'S):SQL查詢不返回結果

SELECT * FROM wp_posts 
LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_term_relationships ON(wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_term_taxonomy ON(wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
LEFT JOIN wp_terms ON(wp_terms.term_id = wp_term_taxonomy.term_id) 
WHERE 
    wp_terms.slug IN ('academia') AND wp_terms.slug IN ('early-career') 
    AND wp_term_taxonomy.taxonomy = 'jobtype' 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'jobs' 
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 

我至少有5個職位,有是在類別academiaearly-career

如果我改變第7行只是有一個IN聲明,它過濾是一類就好:

wp_terms.slug IN ('academia','journalism') //More than one from same category 
AND wp_term_taxonomy.taxonomy = 'jobtype'...... 

它會發現,要麼是學術界抑或新聞(正是我所期望的)的所有作業,但是當我在其他IN語句中添加時,不會返回任何內容(即使我的帖子與邏輯匹配)。

任何人都可以告訴我,如果有什麼不對(可能是IN和值之間的空格?),因爲我一直在這沒有運氣的日子。

任何幫助,非常感謝!謝謝!

P.S.如果有人想看看在現場,這是對(爲看明白我的意思):http://www.libertyguide.com/jobs

目前,我有一個全球性的,而不是OR任何IN的,直到我得到這個工作。

回答

0

IN子句中指定多個值表示該行必須匹配其中的一個值。指定2 IN子句指出該行必須匹配BOTH,這是不可能的(varchar不能同時是'學術'和'早期職業')。

嘗試添加以下到您的查詢的末尾:

HAVING COUNT(*) > [NUMBER OF VALUES SELECTED] 

所以就變成:

SELECT * FROM wp_posts 
LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_term_relationships ON(wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_term_taxonomy ON(wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
LEFT JOIN wp_terms ON(wp_terms.term_id = wp_term_taxonomy.term_id) 
WHERE 
    wp_terms.slug IN ('academia', 'early-career') 
    AND wp_term_taxonomy.taxonomy = 'jobtype' 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'jobs' 
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 
HAVING COUNT(*) = 2 
+0

這是更具可擴展性,但我會指出,它只適用於值是唯一的,以便它不能有兩次相同的值 – Kevin 2012-04-27 18:06:48

+0

我認爲這將工作,如果只有一件事在每個類別中選擇。如果我有HOWING COUNT(*)> 2但詢問「學術界」,「新聞事業」和「早期職業」,是不是可以以'學術界'和'新聞業迴歸職位,但不是'早期職業'? – 2012-04-27 18:21:58

+0

@Kevin:是的,這是正確的,但我懷疑WordPress不允許發生這種情況。 – weenoid 2012-04-27 18:32:32

0
SELECT * FROM wp_posts 
LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_term_relationships ON(wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_term_taxonomy ON(wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
LEFT JOIN wp_terms wt1 ON(wt1.term_id = wp_term_taxonomy.term_id) 
LEFT JOIN wp_terms wt2 ON(wt2.term_id = wp_term_taxonomy.term_id) 
WHERE 
    wt1.slug = 'academia' AND wt2.slug = 'early-career' 
    AND wp_term_taxonomy.taxonomy = 'jobtype' 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'jobs' 
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 

編輯 爲了支持N類,你可以試試這個:

SELECT * FROM wp_posts 
LEFT JOIN wp_postmeta ON(wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_term_relationships ON(wp_posts.ID = wp_term_relationships.object_id) 
LEFT JOIN wp_term_taxonomy ON(wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) 
WHERE 
    wp_term_taxonomy.taxonomy = 'jobtype' 
    AND wp_posts.post_status = 'publish' 
    AND wp_posts.post_type = 'jobs' 
    AND wp_term_taxonomy.term_id IN (SELECT term_id from wp_terms where slug = 'academia') 
    AND wp_term_taxonomy.term_id IN (SELECT term_id from wp_terms where slug = 'early-career') 
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 

您可以根據需要在代碼中多次添加AND wp_term_taxonomy ...行。

+0

這將起作用,但在選擇大量類別時效果不佳。 – weenoid 2012-04-27 18:00:52

+0

我已添加一個編輯以支持N個類別。 – therealmitchconnors 2012-04-27 18:06:35

+0

我喜歡這一款的外觀,但我不認爲它會過濾我想要的。我想在類別中執行OR過濾器,但是在類別之間使用AND過濾器。例如,我想讓它看起來像這樣:WHERE('academia'或'journalism')AND('this'或'that')和('something'或'something-else')。這將與它一起工作嗎? – 2012-04-27 18:25:13