我正在使用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)。
不是结果:(新闻,早期职业) - 缺少全职或兼职
我真的希望这会更清楚。如果我能正常工作,我愿意给予赔偿。
答案 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"
}
显然,您需要过滤并转义已提交的任何值。