1

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

在我的类型列表中,我选择了两件事:全职,兼职

在我的经验列表中,我选择了三件事:Earlycareer、Midcareer、Latecareer。

当我运行查询时,我想确保每条记录至少包含三个列表中的每一个。可能的结果:(网络开发、兼职、职业中期)、(学术界、全职、早期职业、职业中期)。

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

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

4

3 回答 3

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。

于 2012-04-25T17:48:58.473 回答
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 '

于 2012-04-25T18:02:29.217 回答
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"
}

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

于 2012-04-25T16:58:42.997 回答