使用AND OR进行筛选-仅在满足所有条件时返回



我需要根据用户输入(复选框)过滤MySQL数据,但我使用的查询没有按预期工作。

我使用3列(和3组复选框)来过滤数据:类型、状态和bhk(均为整数)。

if ($filter_type != NULL) {
    foreach ($filter_type as $type=>$value) {
        if ($type === 0) {
            $type_cond = "AND t2.type = " . $value;
        } else {
            $type_cond .= " OR t2.type = " . $value;
        }
    }
}
if ($stmt = $mysqli->prepare(' SELECT t1.id, t2.*
                               FROM ' . $table . ' t1
                               INNER JOIN property t2 ON t2.id = t1.id
                               WHERE t2.use = ?
                               ' . $type_cond . '
                               ' . $status_cond . '
                               ' . $bhk_cond . '
                               ' . $filter_city . '
                               ' . $filter_zone . '
                               LIMIT ?, ?'))

其他两个也是如此。在表property中,我有1行:类型=2,状态=0和bhk=3。

我选中复选框类型1和2,bhk 1(AND type = 1 OR type = 2 AND bhk = 1):不返回任何内容,好吗。如果我继续选中bhk 3:它返回行,好吗?但如果我也想按状态过滤:

AND t2.type = 1 OR t2.type = 2
AND t2.bhk = 1 or t2.bhk = 3
AND t2.status = 1 OR t2.status = 2

为什么上面的句子返回行?最后一个AND和OR不是真的。我需要的是:只返回与3个AND/or匹配的数据(如果没有使用3个组中的一个,则返回2个)。

我该怎么做?

我也有一些疑虑:(第一个例子)

AND t2.type = 1 OR t2.type = 2
AND t2.status = 0 --OR t2.status = 1 
AND t2.bhk = 1

不返回行。。。但如果我添加OR t2.status = 1,它将返回行。。。为什么?

(第二个例子)

AND t2.type = 1 OR t2.type = 2
AND t2.status = 1
AND t2.bhk = 3 --OR t2.bhk = 1

这没有任何意义。。。请开导我。

第二个问题是:为什么AND does t2.status = 0不返回行,而AND t2.status = 0 OR t2.status = 1返回行?(基于第一个示例)

编辑:添加新脚本(使用IN()而不是OR

$type_count = count($filter_type);
$type_cond = '';
if ($filter_type != NULL) {
    foreach ($filter_type as $type=>$value) {
        if ($type === 0) {
            $type_cond = 'AND t2.type IN ( ' . $value;
            if ($type_count === 1) {
                $condition .= ')';
            }
        } else if ($type < $count) {
            $type_cond .= ', ' . $value;
        } else {
            $type_cond .= ', ' . $value . ')';
        }
    }
}

您的过滤器:

AND t2.type = 1 OR t2.type = 2
AND t2.bhk = 1 or t2.bhk = 3
AND t2.status = 1 OR t2.status = 2

也可以写成L

AND t2.type = 1 OR (t2.type = 2
AND t2.bhk = 1) or (t2.bhk = 3
AND t2.status = 1) OR t2.status = 2

也就是说,如果t2.status = 2,不管它的其余部分是什么,它都会返回TRUE。你可以使用正确的Paranostics来修复它,但如果你使用IN 可能会更好

AND t2.type IN (1,2)
AND t2.bhk IN (1,3)
AND t2.status IN (1,2)

最新更新