[英]Query using three terms in SQL/PHP
我正在使用WordPress,但這個問題更多地涉及到SQL。 如果需要的話,我很樂意搬家。
我正在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
過濾。
我的新過濾僅在選擇了一個項目時才有效,但是當我選擇多個項目時(我知道它會與幾個帖子匹配)不會返回任何內容。
我已經考慮過這個邏輯,但我沒有看到任何錯誤。 我知道其他任何事都沒有錯,所以它必須是查詢本身。
我們將非常感謝正確方向的任何一步。 謝謝!
更新從混亂中,基本上我有這個:
"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 *
這是和例子:
在我的興趣列表中,我選擇了三個方面:WebDevelopment,Academia,Journalism。
在我的類型列表中,我選擇了兩件事:Fulltime,Parttime
在我的經驗列表中,我選擇了三件事:Earlycareer,Midcareer,Latecareer。
當我運行查詢時,我想確保每條記錄至少具有三個列表中的每一個。 可能的結果:(WebDevelopment,兼職,Midcareer),(Academia,Fulltime,Earlycareer,Midcareer)。
不是結果:(新聞,早期職業) - 缺少全職或兼職
我真的希望這能更清楚。 如果我能正常工作,我願意給予賠償。
好的,我會對此有所了解:
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。
我認為您正在尋找可以從表單動態生成的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] = '';
}
您將結果字符串連接在一起並使用它構建查詢。 WHERE 1=1
技巧是有問題的,因為如果沒有選擇任何內容,數據庫中的所有內容都將匹配,因此我強烈建議您完成正確添加AND
運算符的過程。
編輯:我發現,如果你將條件語句構建為一個數組,你可以使用' AND '
來破壞它們 ,並在相當少量的代碼行中獲取查詢。
根據你所說的有點混淆但是如果我想構建一個過濾器,我會根據提交的過濾器值動態生成SQL查詢。 就像是:
$sql = "SELECT * FROM $wpdb->posts WHERE 1=1";
if ( !empty($interest) ) { // they ticked the interested in ??? checkbox
$sql .= " AND $wpdb->terms.slug = $interest"
}
顯然,您需要過濾並轉義已提交的任何值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.