sql - 为数据表中的每一行选择 COUNT(foreign ID)

标签 sql sql-server-2008 tsql select count

我在存储每日内容选择的地方有数据表。 这每天都不一样。

当我选择多于一天时,我需要退回所有天都相同的元素。

我试过这样的:

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:我已经上传图表: Database diagram

这里是示例数据(对于meal Id = 1,这也是在表单上选择的),解释: - ID 为 125 的食谱将出现在星期一 (weekDayId = 1) 和星期六 (weekDayId = 7)。因此,如果我只选择星期一或者如果我只选择星期六或者如果我选择星期一和星期六,则必须返回此食谱。如果我还选择任何其他日期,则不会返回此记录。 - 选择第 1、6 和 7 周(星期一、星期六、星期日)时,必须返回 ID 为 105 的食谱。与上面相同,如果选择任何其他日期则不返回此记录。 Sample data

最佳答案

可能这对你有帮助-

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/

相关文章:

sql - 如何让字符串自动递增

sql - 如何引用 sql 中紧接在组中另一条记录之前的记录?

database - 数据库中有新条目后自动创建 PDF

sql - T-SQL : CHECK constraint not working

sql - TSQL Pivot 4 值列

sql - 显示一行中的字段

sql - 异步运行 SQL 查询

javascript - 找到最接近给定时间数组的时间

sql-server - Entity Framework - 行大小大于允许的最大行大小 8060

sql-server - nvarchar(max) 与 NText