我正在使用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....)
你可以了解我在想什么。
答案 0 :(得分:1)
由于MPG类是互斥的,因此在查询中组合它们的唯一方法是通过OR
子句(因为汽车只能在一个或另一个)。
所以,你需要使用像
这样的东西(a.mpgcombined < 18) OR (a.mpgcombined >= 18 AND a.mpgcombined <= 23)
即。将您的类定义子括号放在括号中,然后将它们与OR
运算符
如果你要将整个子句与其他子句组合在一起,你可能需要将整个子句放在括号中,这样OR
子句就不会改变整个WHERE
的含义。条款。