0

私が開発しているアプリケーションでは、ユーザーはパラメーターを設定して、取得する最終製品を定義する必要があります。

私のテーブルは次のようになります:

Categories
-------------
Id   Name
1     Material
2     Color
3     Shape


Parameters
-------------
Id   CategoryId  Name
1     1           Wood
2     1           Plastic
3     1           Metal
4     2           Red
5     2           Green
6     2           Blue
7     3           Round
8     3           Square
9     3           Triangle

Combinations
-------------
Id
1
2
...

ParametersCombinations
----------------------
CombinationId  ParameterId
1               1
1               4
1               7
2               1
2               5
2               7

現在、ユーザーはいくつかのパラメーターの組み合わせのみを使用できます。私の例では、彼は赤い丸い木製の物体または緑色の丸い木製の物体を手に入れることができましたが、私が生産できないため、青いものは手に入れることができませんでした。

ユーザーが木と丸のパラメータを選択したとしましょう。青のオプションを無効にできるように、赤と緑しか利用できないことを確認するにはどうすればよいですか? または、データベースをモデル化するためのより良い方法はありますか?

4

2 に答える 2

0

以下を試してください

SELECT p.*, pc.CombinationId
FROM Parameters p
-- get the parameter combinations for all the parameters
JOIN ParametersCombinations pc
  ON pc.ParameterId = p.Id
-- filter the parameter combinations to only combinations that include the selected parameter
JOIN (
    SELECT CombinationId
    FROM ParametersCombinations
    WHERE ParameterId = 7      -- 7 is the selected parameter
) f ON f.CombinationId = pc.CombinationId

または、すでに選択されているパラメータを削除します

SELECT p.*, pc.CombinationId
FROM Parameters p
JOIN ParametersCombinations pc
  ON pc.ParameterId = p.Id
JOIN (
    SELECT CombinationId
    FROM ParametersCombinations
    WHERE ParameterId IN (7, 1)
) f ON f.CombinationId = pc.CombinationId
WHERE ParameterId NOT IN (7, 1)
于 2013-08-21T14:32:07.140 に答える
0

選択したパラメーター 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 フレームワークのいずれかを使用していることです。

あなたのロジックは次のようになります。

  1. すべてのパラメーターを含むすべての組み合わせを検索し、parameterListこれらの見つかった組み合わせをリストに入れます。relevantCombinations
  2. リスト内の組み合わせを少なくとも 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箇所の小さなキズがある場合がございます。

要約すると、強度の降順での私の推奨事項は次のとおりです。

  1. Rails や CakePHP などのフレームワークと、疑似コードのステップ 1 と 2findを必要な数だけ使用します。(最強)
  2. 生のスクリプト言語と疑似コードのステップ 1 と 2、および必要な数の単純なクエリを使用します。
  3. 私が作成した生の MySQL クエリを使用します。(最も弱い)

PS パラメータの名前を取得する方法について、クエリの一部を省略しました。しかし、私の答えから ParameterIDs を取得できることを考えると、それは簡単だと思います。また、既に選択されているパラメーター (1、7) を削除する必要がある場合がある方法についても省略しました。繰り返しますが、それはあなたにとって些細なことです。

于 2013-08-21T15:23:15.263 に答える