0

我正在使用 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

这些东西是动态的,所以我不知道条件会是什么,所以像第一个选项这样的东西让我不必为每个可能的场景定义 sql。无论如何不必为每种可能的组合定义sql吗?sql不是我的强项。

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

我需要知道如何为给定的范围动态创建这个 where 子句,最好不必为每种可能的情况定义 where 子句,即:

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

您可以了解我的想法。

谢谢

4

1 回答 1

0

当您生成WHERE子句时,包装每个条件并将它们与OR.

所以你的例子变成:

AND ((a.mpgcombined < 18 AND a.mpgcombined >= 18) OR (a.mpgcombined <= 23))
于 2013-07-15T17:53:30.697 回答