2012-04-25 27 views
1

我正在使用WordPress,但此問題更多涉及到涉及的SQL。如果需要的話,我會很樂意提出。使用SQL/PHP中的三個術語進行查詢

我正在研究http://www.libertyguide.com/jobs,我試圖改變過濾機制。目前這是一個全球性的OR查詢。

不管怎麼說,我有三個過濾列表以及我存儲什麼選入三串(利益,類型,經驗)以下列方式:

"($wpdb->terms.slug = 'webdevelopment' OR $wpdb->terms.slug = 'journalism' OR ...) AND" 

它是由填充無論是在我的過濾選擇名單。

當它發生的時候,我有這樣一個基本的查詢(我要離開了LEFT JOINS):

前:

SELECT * FROM $wpdb->posts WHERE ($wpdb->terms.slug = 'fromlist1' 
OR $wpdb->terms.slug = 'fromlist2' OR $wpdb->terms.slug = 'fromlist3') 
AND $wpdb->term_taxonomy.taxonomy = 'jobtype'... 

後:

SELECT * FROM $wpdb->posts WHERE 
($wpdb->terms.slug = 'fromlist1' OR $wpdb->terms.slug = 'fromlist1again') 
AND ($wpdb->terms.slug = 'fromlist2' OR $wpdb->terms.slug = 'fromlist2again') 
AND ($wpdb->terms.slug = 'fromlist3' OR $wpdb->terms.slug = 'fromlist3again') 
AND $wpdb->term_taxonomy.taxonomy = 'jobtype'... 

所以基本上我想從

OR過濾器

一個AND濾波器OR濾波其間。

我的新過濾只在選擇了一個項目時才起作用,但當我選擇多個項目時(我知道會與幾個帖子匹配),它將不會返回任何內容。

我想通過邏輯,我沒有看到任何錯誤。我知道別的什麼都沒有錯,所以它必須是查詢本身。

任何正確的方向步驟將不勝感激。謝謝!

UPDATE 從混亂,基本上我有這樣的:

"SELECT ...... WHERE $terms ..." 

,但我想

"SELECT ....... WHERE $interests AND $type AND $experience" 

我不想把它過濾$interest[1] OR $interest[2] OR $type[1] OR $experience[1],而是希望它過濾器($interest[1] OR $interest[2]) AND ($type[1]) AND ($experience[1])

我希望這樣做更有意義

* 更新2 *

這裏的和例如:

在我的興趣列表中,我選擇例如三兩件事:web開發,學術界,新聞界。

在我的類型列表中,我選擇了兩兩件事:全職,兼職

以我的經驗列表中,我選擇了三兩件事:Earlycareer,職業生涯中期階段,Latecareer。

當我運行我的查詢時,我想確保每個記錄至少有三個列表中的每個列表中的一個。可能的結果:(Web開發,兼職,中等教育),(學術界,全職,早期教育者,中等教育者)。

不是一個結果:(新聞,Earlycareer) - 缺少全職或兼職

我真的希望這更清除它。如果我能夠正確地工作,我願意給予賠償。

+0

也許這會有所幫助,因爲我知道有很多'WP'語法會把我扔掉,並可能會拋棄其他人。你可以給出一個'$ interest [1','$ interest [2]','$ type [1]','$ experience [1]''的示例列表,然後顯示您期望/想要修改的查詢的行回來?據我所知,你說它必須在'experience'和'type'中出現,並且至少有一個'interest'列表,對嗎?如果是這樣,使WP做到這一點的問題? – Anthony 2012-04-25 17:33:54

+0

@Anthony我想你明白了。這不僅僅是WP,我遇到了問題,這是SQL語句。用示例列表查找更新。 – 2012-04-25 17:44:14

回答

0

根據你所說的話會有點困惑,但如果我想構建一個過濾器,我將根據提交的過濾器值動態生成SQL查詢。例如:

$sql = "SELECT * FROM $wpdb->posts WHERE 1=1"; 
if (!empty($interest)) { // they ticked the interested in ??? checkbox 
    $sql .= " AND $wpdb->terms.slug = $interest" 
} 

很明顯,您需要過濾和轉義任何已提交的值。

+0

我已經生成了,我只是拼寫出來,因爲如果選擇了某些內容,它實質上就是它創建的。基本上,而不是基於所有他們選擇使用OR語句篩選,我想要它分成三個不同的類別使用它們之間的過濾。 – 2012-04-25 17:19:03

+0

所以你想確保他們從每個$ fromlist中選擇一個? – Malovich 2012-04-25 17:22:27

+0

@Movovich一種。他們不需要從每個選項中選擇一些,但我希望它根據他們之前在過濾中選擇的內容進行過濾。如果你看看我發佈的網站,你應該明白我的意思。例如,如果我選擇Web開發和全職,它將使用Web開發或全職方式返回帖子,而不是帶Web開發和全職的帖子。我可以將整個事情改變爲一個AND過濾器,但這並不能解決某人是否選擇了多個興趣。 – 2012-04-25 17:24:14

2

好吧,我會在此進行拍攝:

SELECT * FROM $wpdb->posts WHERE 
(
$wpdb->terms.slug IN ('$interest1', '$interest2') AND 
$wpdb->terms.slug IN ('$type1', '$type2') AND 
$wpdb->terms.slug IN ('$exp1', '$exp2') 
) 
AND $wpdb->term_taxonomy.taxonomy = 'jobtype' 

IN關鍵字將返回true,如果匹配組的任何成員。

+0

我正在更改我的代碼。如果我發現任何問題,我會回覆。非常感謝您的耐心和您的幫助! – 2012-04-25 17:55:27

+0

沒問題。這與你已有的東西非常接近,所以一定要讓我知道它是否無效。 – Anthony 2012-04-25 18:26:37

+0

全部完成編輯。運行它時,我的查詢中沒有返回任何內容。嗯... – 2012-04-25 18:44:45

1

我想你正在尋找WHERE category IN (comma, seperated, list, of, values),你可以從窗體動態生成。如果你與其他類別結合起來,你可以要求他們選擇從每個東西...

WHERE category1 IN (a, comma, seperated, list, of, values) 
AND category2 IN (another, list, of, values) 
AND ... 

如果從每個類別中選擇的東西,如果有的話會返回任何這隻會返回一個值選擇列表是空的;實際上它可能會踢出一個錯誤,所以如果給定類別中有任何內容,我也會動態地生成查詢。

if (!empty($arrayOfCategory1)) { 
    //sanitize input logic here 
    $Category[1] = 'category1 IN ('. implode(', ', $arrayOfCategory1) .')'; 
} else { 
    $Category[1] = ''; 
} 

您將生成的字符串連接在一起並使用該字符串構建查詢。技巧是有問題的,因爲如果沒有選擇任何東西,數據庫中的所有內容都會匹配,所以我強烈建議通過正確添加AND運算符的過程。

編輯:它發生,我認爲如果你建立的條件語句爲數組,可以爆那些' AND ',並在相當少的代碼行得到查詢。

+0

感謝您的輸入。我從來沒有使用1 = 1的技巧,並沒有計劃(它將已經返回我需要的所有cpt的帖子)。我甚至沒有想到內爆功能(我使用了一個foreach並從最終的逗號中刪除)。我會記住你的想法。謝謝! – 2012-04-25 18:09:47