我遇到了MySQL查询的逻辑问题,并希望就使用何种类型的细化提供一些建议。
出于解释问题的目的,假设您有3个名为ListA,ListB和ListC的下拉列表。 ListA的人口为Cat1,Cat2,Cat3,ListB,Cat4,Cat5,......等等。
因此,3个列表共有9个类别。这些列表是通过扫描数据库中的不同条目然后填充列表生成的,因此搜索细化将随着新条目和类别的创建而自动增长。
我的问题是多个类别的选择查询,因为我希望用户能够选择他们运行的搜索的精确程度。所以使用ListA会给出一点改进,ListA和ListB会像大多数搜索引擎一样精炼更多等等。但是我的查询需要100%的数据输入才能选择,好像什么都没有输入一样,它会寻找一个永远不会发生的空白空间,从而什么都不返回。
所有变量都是通过post发送的,并通过收集它们存储为处理页面中的变量,然后使用if语句将它们分配给变量来检测值,起初我以为我可以用任意值填充条目,如果它是空的,但我找不到一个永远都是真的,我看着BOOLEAN但是也无法使它工作。
我使用以下查询:
SELECT * FROM classifieds WHERE listA = "'.listA.'" AND listB = "'.listB.'" AND listC = "'.listC.'"
查询需要是AND逻辑,因此它会查找满足所有要求的条目,但是如果例如ListB没有填充,因为用户没有被该字段打扰(说它是价格而用户并不关心) ,我怎么能让它忽略该部分或让它不挑剔。
对于where子句是否存在通用查询,即使其空白也可用于选择它?
我确定这里会有一些重复,但我不确定它会被称为什么,因为我见过的每一个星期都是完全不同的。我知道我可以用准备好的查询来做到这一点,但我需要为每个活动框组合设置一个逻辑数组,而对于2-3这样的情况,我有10个以上的选择器,而且选择太多了。
任何人都可以帮助我了解完成此任务的方向吗?它似乎非常简单,但却是一种痛苦的工作。
由于
答案 0 :(得分:1)
where ("'.listA.'" = '' or listA = "'.listA.'")
and ("'.listB.'" = '' or listB = "'.listB.'")
and ("'.listC.'" = '' or listC = "'.listC.'")
答案 1 :(得分:1)
您可以基于条件编写查询。例如,
以下代码将允许您仅访问USER Selected和您的查询根据用户搜索条件运行的变量。
$whereArr = array();
if(isset($_REQUEST['listA'])) {
$whereArr[] = " listA = '" . $_REQUEST['listA'] . "'";
}
if(isset($_REQUEST['listB'])) {
$whereArr[] = " listB = '" . $_REQUEST['listB'] . "'";
}
if(isset($_REQUEST['listC'])) {
$whereArr[] = " listC = '" . $_REQUEST['listC'] . "'";
}
$where_Clause = " ";
if(count($whereArr) > 0) {
$where_Clause = " WHERE " . implode(" AND ", $whereArr);
}
$query = "SELECT * FROM classifieds " . $where_Clause;
答案 2 :(得分:0)
将描述过滤器的变量设为:
string filters = "where ";
假设您有10个过滤器,即A,B,C .....将它们保持在阵列中 遍历数组时,检查选择了哪一个,并将其添加到过滤器变量中:
filter+="listA='sometext'";// here filter A was selected
同样可以添加其他过滤器。
filter+="and listB='sometext'";// here filter B was selected after A ,while traversing through the loop;
进行一些调整以在第二次过滤之后添加'和'
过滤字符串现在将显示为
filter = "select * from table where listA='sometext' and listB='sometext'";
然后在查询字符串中使用变量过滤器:
query="select * from table "+filter;
(照顾中间所需的空格)
希望这有帮助