3

This is a very very important sql query after which my whole website is based..

and its not working..

Its difficult to explain without an example..

There are 2 tables, One is IngredientsTable and other one is ProductsTable.

In IngredentsTable i have the following

  1. Bread
  2. ChickenBreast
  3. Noodles
  4. Mayonaise
  5. Cheese
  6. Ketchup
  7. Butter

And the ProductsTable

  1. Spageti
  2. Chicken Breast Sandwich

And there is a MAPPING TABLE that connects both tables. It has IngredientID and ProductID

Now, Mapping table Chicken Breast Sandwich - Bread

Chicken Breast Sandwich - Mayonase

Chicken Breast Sandwich - Cheese

Chicken Breast Sandwich - Ketchup

Spageti --- Noodles

Spageti --- Cheese

Spageti --- Ketcup

チーズとケチャップは、鶏胸肉とスパゲティの両方に共通のエントリであることに気付くでしょう。

指定された成分を持つ製品の ID を取得する SQL クエリを作成したいと考えています。

次のクエリで部分的に達成できます

SELECT 
  ProductTable.id,
  ProductTable.Name 
FROM ProductTable 
INNER JOIN MappingTable 
  ON ProductTable.id = MappingTable.ProductID
WHERE MappingTable.IngredientID =  5; 

5 がチーズだとすると、チキン ブレスト サンドイッチとスパゲッティの結果を得ることができました。

しかし、もう1つ追加すると、 WHERE MappingTable.IngredientID = 5,6; 6 はパンです。チキン ブレスト サンドイッチのみが表示され、スパゲティは表示されません。

エラー「、」構文が表示されます..「and」でも結果が得られません。

WHERE MappingTable.IngredientID = 5,6,7;のような複数の成分を確認するにはどうすればよいですか?

どんな助けでも大歓迎です!!!

これを単一のクエリに含める必要があります..

オプションを表示してください

4

5 に答える 5

3

2 つのクエリを使用すると、結果の交差を使用できます

しかし、あなたはそれが 1 つのクエリで欲しいと言います。

近似値は、group by ステートメントを使用して、結果から受け取った行数をカウントすることです。それはあなたの成分の量と同じでなければなりません。ただし、同じ製品で成分が複数回繰り返される場合は機能しません.

2 つの成分 ID のこの行に沿った何か:

SELECT ProductTable.id, ProductTable.Name FROM ProductTable 
INNER JOIN MappingTable ON ProductTable.id = MappingTable.ProductID 
WHERE MappingTable.IngredientID in (5,6) group by ProductTable.id, ProductTable.Name 
HAVING count(*) = 2;
于 2009-08-31T13:07:37.717 に答える
1

まず、例のテーブルのデータが例の質問と一致するように質問を編集します... 5 がチーズで 6 がパンの場合、Ingredients テーブルをそれに一致させます。そうでなければ混乱します。

第二に、「スパゲッティではなく、チキンブレストサンドイッチのみを表示する必要があります」と述べているため、リストされているすべての成分を含む製品を知りたいと思います。もしそうなら、あなたは次のことを望みます

  Select P.id,  P.Name 
  FROM ProductTable P 
  Where Exists (Select * From Mapping Table
                Where ProductId = P.ProductId
                    And IngredientId = 5)
    And Exists (Select * From Mapping Table
                Where ProductId = P.ProductId
                    And IngredientId = 6)
    And Exists (Select * From Mapping Table
                Where ProductId = P.ProductId
                    And IngredientId = 7)

または、8ng カウント ロジックを使用します。

   Select P.id,  P.Name 
   From ProductTable P 
   Where (Select Count(Distinct IngredientId)
          From MappingTable M
          Where ProductId = P.ProductId 
            And IngredientId In (5,6,7)) = 3
于 2009-08-31T13:10:34.753 に答える
0

成分ごとに個別にマッピング テーブルにリンクする必要があります。

SELECT 
  ProductTable.id,
  ProductTable.Name 
FROM ProductTable 
INNER JOIN MappingTable AS MappingTable1
  ON ProductTable.id = MappingTable1.ProductID
  AND MappingTable1.IngredientID = 5
INNER JOIN MappingTable AS MappingTable2
  ON ProductTable.id = MappingTable2.ProductID
  AND MappingTable2.IngredientID = 6

他のポスターが提案したように IN 演算子を使用すると、IN は本質的に OR 型のクエリであるため、パンとチーズのスパゲッティとチキン サンドイッチの両方が得られます。

于 2009-08-31T13:06:29.273 に答える
0

これは機能するはずですが、2 つの「変数」を指定する必要があります。1 つ目はコンマで区切られた IngredientID のセットで、2 つ目 (@IngredientsCount) はそのリスト内の成分の数です。

SELECT ProductsTable.id, ProductTable.Name
FROM ProductsTable
INNER JOIN (SELECT ProductID, Count(*) AS Ingredients
    FROM MappingTable
    WHERE IngredientID IN (...ids of ingredients here...)
    GROUP BY ProductID
    HAVING Count(*) = @IngredientsCount) AS ProductIngredients ON ProductsTable.ProductID = ProductIngredients.ProductID

同じ成分が 2 回記録される可能性がある場合 (ただし、テーブル構造ではそれが許可されていないように見えますが、おそらく必要ではありません)、2 つの Count(*) を Count(Distinct IngredientID) に切り替え、@IngredientCount を次のように変更します。使用されるさまざまな成分の数になります。

于 2009-08-31T13:20:13.277 に答える