選択したパラメーター ID を次の形式で指定するとします。
// I call this a **parameterList** for convenience sake.
(1,7) // this is parameter id 1 and id 7.
また、アプリを支援するために何らかのスクリプト言語を使用していると想定しています。ruby や php のように。
また、ストアド プロシージャや MySQL クエリにできるだけ多くのロジックを入れないようにしたいと考えています。
もう 1 つの前提は、Rails、Symfony、CakePHP などの Rapid Application MVC フレームワークのいずれかを使用していることです。
あなたのロジックは次のようになります。
- すべてのパラメーターを含むすべての組み合わせを検索し、
parameterList
これらの見つかった組み合わせをリストに入れます。relevantCombinations
- リスト内の組み合わせを少なくとも 1 つ含むすべての parameters_combinations を検索します
relevantCombinations
。一意のパラメーター値のみを取得します。
最初の 2 つのステップは、上記で説明したフレームワークの単純な Model::find メソッドと forloop を使用して解決できます。
フレームワークを使用していない場合は、スクリプト言語 raw を使用するのもクールです。
MySQL クエリでそれらが必要な場合は、いくつかの可能なクエリを次に示します。これらは必ずしも最適なクエリではないことに注意してください。
最初のものは
SELECT * FROM (
SELECT `PossibleList`.`CombinationId`, COUNT(`PossibleList`.`CombinationId`) as number
FROM (
SELECT `CombinationId` FROM `ParametersCombinations`
WHERE `ParameterId` IN (1, 7)
) `PossibleList` GROUP BY `PossibleList`.`CombinationId`
) `PossibleGroupedList` WHERE `number` = 2;
-- note that the (1, 7) and the number 2 needs to be supplied by your app.
-- 2 refers to the number of parameters supplied.
-- In this case you supplied 1 and 7 therefore 2.
確認するには、http://sqlfiddle.com/#!2/16831/3を見てください。
パラメーター 1 のみを持ち、7 を持たない組み合わせ 3 を意図的に作成したことに注意してください。したがって、クエリは 3 を返しませんでしたが、1 と 2 のみを返しました。最初の行のアスタリスク * を自由に微調整してください。
二つ目は
SELECT DISTINCT(`ParameterID`)
FROM `ParametersCombinations`
WHERE `CombinationId` IN (1, 2);
-- note that (1, 2) is the result we expect from the first step.
-- the one we call relevantCombinations
確認するには、http://sqlfiddle.com/#!2/16831/5をご覧ください。
マゾヒストになることはお勧めしません。単一のクエリで答えを得ようとすることはお勧めしません。
また、私が提供した MySQL クエリを使用することもお勧めしません。マゾヒスティックではありません。しかし、私がこの方法を推奨しないのは十分に自虐的です。
mysql 以外のタグを示していないので、mysql の方が強いのではないかと思います。したがって、私の答えにはmysqlが含まれています。
私の最も強い提案は私の最初のものです。確立されたフレームワークを最大限に活用し、ロジックをビジネス ロジック レイヤーに配置します。データ層ではありません。フレームワークを使用せず、生の php と ruby のみを使用する場合でも、MySQL よりもロジックを配置するのに適した場所です。
T が 1 つの MySQL クエリで答えを出しているのを見ましたが、1 つのパラメーターしか考慮していないことがわかります。
この部分を参照してください。
WHERE ParameterId = 7 -- 7 is the selected parameter
forloop と追加の OR 句を使用して、いくつかの策略で彼/彼女の答えを適応させることができます。
繰り返しますが、アプリ構築の全体像としてはお勧めしません。
http://sqlfiddle.com/#!2/2eda4/2で彼/彼女の答えもテストしました。1~2箇所の小さなキズがある場合がございます。
要約すると、強度の降順での私の推奨事項は次のとおりです。
- Rails や CakePHP などのフレームワークと、疑似コードのステップ 1 と 2
find
を必要な数だけ使用します。(最強)
- 生のスクリプト言語と疑似コードのステップ 1 と 2、および必要な数の単純なクエリを使用します。
- 私が作成した生の MySQL クエリを使用します。(最も弱い)
PS パラメータの名前を取得する方法について、クエリの一部を省略しました。しかし、私の答えから ParameterIDs を取得できることを考えると、それは簡単だと思います。また、既に選択されているパラメーター (1、7) を削除する必要がある場合がある方法についても省略しました。繰り返しますが、それはあなたにとって些細なことです。