1

私はmysqlでいくつかの作業を行っており、唯一の解決策が可能なすべての組み合わせを定義することであるという独特の状況にあります。これを行うためのより簡単な/より良い方法があるかどうか疑問に思っています。

この sql は mpgs の 5 つのカテゴリを作成します

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 より大きい場合のみです。

その後、ユーザーは必要な数のカテゴリ範囲を選択できます。

私が遭遇した問題は、ユーザーが 18 歳未満と 24 歳未満を選択した場合、次のような where 句が機能しないことです。

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

これは明らかに機能します:

AND a.mpgcombined <= 23

これは動的であるため、どこの条件がどうなるかわからないため、最初のオプションのようなものを使用すると、考えられるシナリオごとに sql を定義する必要がなくなります。

とにかく、考えられるすべての組み合わせに対してSQLを定義する必要がないということはありますか? SQLは私の強みではありません。

このクエリがその where 句で意味をなさないと考えている場合は、ユーザーが mpg を選択した場合にこの SQL が呼び出されないことを心配しないでください。無効になりますが、where 句は他のいくつかのクエリに適用されます。

18歳未満、36歳未満、35歳以上が選択された場合、SQLを生成するにはどうすればよいですか?? ユーザーは任意の組み合わせを選択できます。

これは私が念頭に置いていることです...基本的に、考えられるシナリオごとにifステートメントとelseifステートメントが49個程度です。

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

私が考えていることのイメージをつかむことができます。

4

1 に答える 1

2

MPG クラスは相互に排他的であるため、クエリでそれらを結合する唯一の方法はOR句を使用することです (car はどちらか一方にのみ含めることができるため)。

したがって、次のようなものを使用する必要があります

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

つまり、クラスを定義するサブ句​​を括弧で囲み、それらをOR演算子で結合します

OR節が節全体の意味を変更しないように、他の節と組み合わせる場合は、結果の副節全体も括弧で囲む必要がある場合がありますWHERE

于 2013-07-16T13:17:10.667 に答える