1

我正在使用 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 子句会应用于其他几个查询。

如果选择了 under18、under36 和 over35,我将如何生成 sql?用户可以选择他们想要的任何组合。

这就是我的想法……基本上是 49 或任何 if 和 elseif 语句用于每种可能的情况。

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

你可以得到我在想什么的图片。

4

1 回答 1

2

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

所以,你需要使用类似的东西

(a.mpgcombined < 18) OR (a.mpgcombined >= 18 AND a.mpgcombined <= 23)

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

如果您将其与其他子句组合,您可能还需要将整个结果子句放在括号中,以便这些OR子句不会改变整个WHERE子句的含义。

于 2013-07-16T13:17:10.667 回答