私は、毎日のコンテンツの選択を保存する場所をデータ化できます。これは日ごとに異なります。
複数の日を選択すると、すべての日で同じアイテムを返品する必要があります。
私はこのようなことを試しました:
SELECT * FROM
(
SELECT
( -- For count
SELECT COUNT(recipeId) AS [Count]
FROM DailyContentDish
WHERE
(
(weekDayId=@mon OR @mon IS NULL) OR
(weekDayId=@tue OR @tue IS NULL) OR
(weekDayId=@wed OR @wed IS NULL) OR
(weekDayId=@thu OR @thu IS NULL) OR
(weekDayId=@fri OR @fri IS NULL) OR
(weekDayId=@sat OR @sat IS NULL) OR
(weekDayId=@sun OR @sun IS NULL)
)
GROUP BY DailyContentDish.recipeId
) AS cnt,
-- End for count
DailyContentDish.dailyContentDishId,
DailyContentDish.recipeId AS Rec,
title,
150 AS calories,
defaultSmallImagePath,
activePreparationTime + passivePreparationTime AS overallPreparationTime,
CAST(
CASE WHEN EXISTS
(
SELECT DailyContentDishFavourite.dailyContentDishFavouriteId
FROM DailyContentDishFavourite
WHERE DailyContentDishFavourite.dailyContentDishId = DailyContentDish.dailyContentDishId
)
THEN 1
ELSE 0
END
AS BIT) AS isFavouriteWhenGeneratingMenu
FROM DailyContentDish
LEFT OUTER JOIN
RecipesTranslations ON RecipesTranslations.recipeId = DailyContentDish.recipeId
LEFT OUTER JOIN
RecipeAdditionalInformation ON RecipeAdditionalInformation.recipeId = DailyContentDish.recipeId
WHERE
isEnabled = 1 AND
mealId=@mealId AND
(
weekDayId=@mon OR
weekDayId=@tue OR
weekDayId=@wed OR
weekDayId=@thu OR
weekDayId=@fri OR
weekDayId=@sat OR
weekDayId=@sun
)
) p
WHERE p.cnt = @daysCount
問題は、count を返すネストされた select が、1 つのエントリ (つまり、各行) だけでなく、すべての行に対してそれを返すことです。レシピIDのエントリが複数回入力されているので、何回入力されているか知りたいです。
SELECT
( -- For count
SELECT COUNT(recipeId) AS [Count]
FROM DailyContentDish
WHERE
(
(weekDayId=@mon OR @mon IS NULL) OR
(weekDayId=@tue OR @tue IS NULL) OR
(weekDayId=@wed OR @wed IS NULL) OR
(weekDayId=@thu OR @thu IS NULL) OR
(weekDayId=@fri OR @fri IS NULL) OR
(weekDayId=@sat OR @sat IS NULL) OR
(weekDayId=@sun OR @sun IS NULL)
) AND Something should be here (I guess)
GROUP BY DailyContentDish.recipeId
) AS cnt,
-- End for count
この部分は、選択した各行のエントリの COUNT を返す必要がありますが、すべてのエントリの COUNT を返します。
それとも、これで別の道を歩むべきですか。どんなヒントでも大歓迎です。
MS SQL サーバー 2008 を使用しています
編集:これはストアドプロシージャ全体です:
@userId int,
@languageId int,
@mealId int,
@mon int,
@tue int,
@wed int,
@thu int,
@fri int,
@sat int,
@sun int,
@orderBy nvarchar(2),
@pageSize int,
@startRowIndex int
AS
BEGIN
SET NOCOUNT ON;
DECLARE @daysCount int
SET @daysCount = 0
IF (@mon IS NOT NULL)
BEGIN
SET @daysCount = @daysCount+1
END
IF (@tue IS NOT NULL)
BEGIN
SET @daysCount = @daysCount+1
END
IF (@wed IS NOT NULL)
BEGIN
SET @daysCount = @daysCount+1
END
IF (@thu IS NOT NULL)
BEGIN
SET @daysCount = @daysCount+1
END
IF (@fri IS NOT NULL)
BEGIN
SET @daysCount = @daysCount+1
END
IF (@sat IS NOT NULL)
BEGIN
SET @daysCount = @daysCount+1
END
IF (@sun IS NOT NULL)
BEGIN
SET @daysCount = @daysCount+1
END
-- Insert statements for procedure here
SELECT *
FROM (
SELECT
(
SELECT [Count] = COUNT(recipeId)
FROM dbo.DailyContentDish d
WHERE
(
ISNULL(@mon, weekDayId) = weekDayId OR
ISNULL(@tue, weekDayId) = weekDayId OR
ISNULL(@wed, weekDayId) = weekDayId OR
ISNULL(@thu, weekDayId) = weekDayId OR
ISNULL(@fri, weekDayId) = weekDayId OR
ISNULL(@sat, weekDayId) = weekDayId OR
ISNULL(@sun, weekDayId) = weekDayId
)
GROUP BY d.recipeId
) AS cnt,
d.dailyContentDishId,
d.recipeId AS Rec,
title,
150 AS calories,
defaultSmallImagePath,
activePreparationTime + passivePreparationTime AS overallPreparationTime,
CASE WHEN d2.dailyContentDishId IS NULL THEN 1 ELSE 0 END AS isFavouriteWhenGeneratingMenu
FROM dbo.DailyContentDish d
LEFT JOIN dbo.RecipesTranslations r ON r.recipeId = d.recipeId
LEFT JOIN dbo.RecipeAdditionalInformation t ON t.recipeId = d.recipeId
LEFT JOIN dbo.DailyContentDishFavourite d2 ON d.dailyContentDishId = d2.dailyContentDishId
WHERE isEnabled = 1
AND mealId = @mealId
AND (
weekDayId = @mon OR
weekDayId = @tue OR
weekDayId = @wed OR
weekDayId = @thu OR
weekDayId = @fri OR
weekDayId = @sat OR
weekDayId = @sun
)
) p
WHERE p.cnt = @daysCount
Edit1:図をアップロードしました:
サンプル データ (食事 ID = 1 の場合、これもフォームで選択されます) と説明: - ID 125 のレシピは、月曜日 (weekDayId = 1) と土曜日 (weekDayId = 7) に表示されます。したがって、月曜日のみを選択した場合、または土曜日のみを選択した場合、または月曜日と土曜日を選択した場合は、このレシピを返す必要があります。他の日も選択した場合、このレコードは返されません。- 曜日 1、6、および 7 (月曜日、土曜日、日曜日) が選択されている場合は、ID 105 のレシピを返す必要があります。上記と同様に、他の日が選択されている場合、このレコードは返されません。