在SQL / PHP中使用三个术语进行查询

时间:2012-04-25 16:28:41

标签: php mysql sql

我正在使用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)。

不是结果:(新闻,早期职业) - 缺少全职或兼职

我真的希望这会更清楚。如果我能正常工作,我愿意给予赔偿。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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] = '';  
}  

将结果字符串连接在一起并使用该字符串构建查询。 WHERE 1=1技巧是有问题的,因为如果没有选择任何内容,数据库中的所有内容都将匹配,因此我强烈建议您完成正确添加AND运算符的过程。

编辑:我发现,如果你将条件语句构建为数组,你可以使用' AND '内爆那些,并在相当少量的代码行中获取查询

答案 2 :(得分: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"
}

显然,您需要过滤并转义已提交的任何值。