簡體   English   中英

在SQL / PHP中使用三個術語進行查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM