我在存储每日内容选择的地方有数据表。 这每天都不一样。
当我选择多于一天时,我需要退回所有天都相同的元素。
我试过这样的:
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
问题是,应该返回计数的嵌套选择会为所有行返回计数,而不仅仅是一个条目(即每一行)。 由于带有 recipeId 的条目输入次数超过一次,我想知道它们输入了多少次。
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 Server 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:我已经上传图表:
这里是示例数据(对于meal Id = 1,这也是在表单上选择的),解释: - ID 为 125 的食谱将出现在星期一 (weekDayId = 1) 和星期六 (weekDayId = 7)。因此,如果我只选择星期一或者如果我只选择星期六或者如果我选择星期一和星期六,则必须返回此食谱。如果我还选择任何其他日期,则不会返回此记录。 - 选择第 1、6 和 7 周(星期一、星期六、星期日)时,必须返回 ID 为 105 的食谱。与上面相同,如果选择任何其他日期则不返回此记录。
最佳答案
可能这对你有帮助-
ALTER PROCEDURE dbo.usp_GetDailyContentDish
@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
SELECT @daysCount =
CASE WHEN @mon IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN @tue IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN @wed IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN @thu IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN @fri IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN @sat IS NOT NULL THEN 1 ELSE 0 END +
CASE WHEN @sun IS NOT NULL THEN 1 ELSE 0 END
SELECT
Rec
, calories
, overallPreparationTime
, isFavouriteWhenGeneratingMenu
FROM (
SELECT
(
SELECT [Count] = COUNT(d3.recipeId)
FROM dbo.DailyContentDish d3
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
) AND d3.recipeId = d.recipeId
GROUP BY d3.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
END
小型顶层:
这个:
AND (
weekDayId = @mon OR
weekDayId = @tue OR
weekDayId = @wed OR
weekDayId = @thu OR
weekDayId = @fri OR
weekDayId = @sat OR
weekDayId = @sun
)
可能对此进行优化:
weekDayId % @weekDay = 0
如果@mon,@tue 不为空并且包含 1, 2, ...
关于sql - 为数据表中的每一行选择 COUNT(foreign ID),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16608109/