MySQL和Advanced Where子句

时间:2013-07-16 13:10:27

标签: mysql dynamic where-clause

我正在使用mysql做一些工作并且有一个独特的情况,我遇到的唯一解决方案是定义所有可能的组合。我想知道是否有更容易/更好的方法来做到这一点。

这个sql创建了5类mpgs

SELECT
count(if(a.mpgcombined < 18, a.mpgcombined, NULL)) as under18,
count(if(a.mpgcombined >= 18 AND a.mpgcombined <= 23, a.mpgcombined, NULL)) as under24,
count(if(a.mpgcombined > 23 AND a.mpgcombined <= 28, a.mpgcombined, NULL)) as under29,
count(if(a.mpgcombined > 28 AND a.mpgcombined <= 35, a.mpgcombined, NULL)) as under36,
count(if(a.mpgcombined > 35, a.mpgcombined, NULL)) as over35
FROM styles a, jpgs b, models c, divisions d
WHERE d.divisionid = c.divisionid
AND a.styleid = b.styleid
AND c.modelid = a.modelid
AND a.mktclassid in ($this->mktclassids)
$this->where
AND a.sequence = 0;

然后将这些类别和计数显示给用户作为一堆复选框,但仅限于计数大于0。

然后,用户可以根据需要选择多个类别范围。

我遇到的问题是,如果用户选择under18和under24,那么这样的where子句将不起作用:

AND a.mpgcombined < 18 AND a.mpgcombined >= 18 AND a.mpgcombined <= 23

这显然有效:

AND a.mpgcombined <= 23

这个东西是动态的,所以我不知道where条件会是什么,所以像第一个选项这样的东西让我不必为每个可能的场景定义sql。

无论如何都不必为每个可能的组合定义sql? sql不是我的强项。

如果你认为这个查询对于where子句没有任何意义,不要担心如果用户选择mpg不会调用sql,它会被禁用,但where子句会应用于其他几个查询。

如果选择低于18,低于36,并且选择了超过35,我将如何生成sql? 用户可以选择他们想要的任何组合。

这就是我的想法......基本上是49或者每种可能情况的if和elseif语句。

if(under18 && under24)
    $where = 'AND a.mpgcombined <= 23';
elseif (under29 && under18....)

你可以了解我在想什么。

1 个答案:

答案 0 :(得分:1)

由于MPG类是互斥的,因此在查询中组合它们的唯一方法是通过OR子句(因为汽车只能在一个另一个)。

所以,你需要使用像

这样的东西
(a.mpgcombined < 18) OR (a.mpgcombined >= 18 AND a.mpgcombined <= 23)

即。将您的类定义子括号放在括号中,然后将它们与OR运算符

组合

如果你要将整个子句与其他子句组合在一起,你可能需要将整个子句放在括号中,这样OR子句就不会改变整个WHERE的含义。条款。