根据mysql上的范围进行搜索

时间:2016-03-18 09:32:17

标签: php mysql

我的桌子上有两排。

   start    end
A)  6        10
B)  2        NULL
C)  26       NULL

我必须编写一个查询来列出从用户获取的范围$from$to中的这些行。象 -

条件1 - $from = 3 $to = 8 - 仅列出A

条件2 - $from = 1 $to = 8 - 列出A和B(因为它部分位于范围内)

条件3 - $from = 1 $to = 30 - 列出所有3行。

我在where子句中试过这个 -

WHERE ((start >= $from)) AND ((end <= $to) OR end IS NULL)

但它错误地导致条件1的行C.

请提供任何提示。感谢。

4 个答案:

答案 0 :(得分:1)

以相反的方式修改WHERE子句 -

WHERE ((end >= $from  AND start <= $to ) OR 
       (start BETWEEN $from AND $to AND end IS NULL) )

似乎满足您列出的所有3个条件及其所需的输出。

答案 1 :(得分:0)

您的查询如下所示:

WHERE (start >= 3) AND ((end <= 8) OR (end = NULL))

由于AND部分中的第一个语句为false,因此它会检查第二个语句。输出是:

WHERE (start >= 3) AND (end = NULL)

因为C开始大于3 AND end = NULL所以它被选中

如果删除或重写NULL部分,则应该可以使用WHERE子句。

更新: 如果要忽略NULL值,那么根据数据库中的一个将起作用。

WHERE (start >= 3) AND ((end <= 8) AND (end <> NULL))
WHERE (start >= 3) AND ((end <= 8) AND (end != NULL))
WHERE (start >= 3) AND ((end <= 8) AND (end IS NOT NULL))

更新2: 不再需要最后的括号,给出:

WHERE (start >= 3) AND (end <= 8) AND (end <> NULL)

答案 2 :(得分:0)

如果我理解正确,你可以使用:

WHERE (start BETWEEN $from AND $to) or (end BETWEEN $from AND $to) or (start >= $from AND end == NULL)

答案 3 :(得分:0)

$ WHERE(start&gt; = 3)AND((end&lt; = 8)OR(end = NULL))

你是ccgen.xyz我的朋友