2

需要帮助使这个(某种)工作查询更加动态。

我有三个表 myShows、TVShows 和 Users

  • 我的节目
    • 身份证(PK)
    • 用户(FK 到用户)
    • 节目(FK 到电视节目)

想接受这个查询并将其更改为一个存储过程,我可以将用户 ID 发送到该存储过程中并让它完成其余的工作......

SELECT showId, name, Count(1) AS no_users
FROM
    myShows LEFT OUTER JOIN
              tvshows ON myShows.Show = tvshows.ShowId
WHERE
    [user] IN (
        SELECT [user]
           FROM
               myShows
           WHERE
               show ='1' or show='4'
          )
    AND
    show <> '1' and show <> '4'
GROUP BY
    showId, name
ORDER BY
    no_users DESC

这现在有效。但正如您所看到的,问题出在 WHERE (show ='1' 或 show='4')和 AND (​​ show <> '1' 和 show <> '4')语句中,这些语句当前是硬编码值,这就是我需要动态的,因为我不知道用户是否需要检查 3 或 30 个节目。

这个过程的效率有多低?这将用于可能获得大量用户的 iPad 应用程序。我目前运行的电影 API (IMDbAPI.com) 每小时点击量约为 13 万次,并且必须进行大量数据库/代码优化以使其快速运行。再次感谢!

如果您想要用于测试的数据库架构,请告诉我。

4

1 回答 1

1

这将满足您的要求

select name, count(distinct [user]) from myshows recommend
inner join tvshows on recommend.show = tvshows.showid
where [user] in 
(   
    select other.[user] from 
        ( select show from myshows where [User] = @user ) my,
        ( select show, [user] from myshows where [user] <> @user ) other
    where my.show = other.show
)   
and show not in ( select show from myshows where [User] = @user ) 
group by name
order by count(distinct [user]) desc

如果您的 SQL 平台支持WITH公用表表达式,则可以优化上述内容以使用它们。

随着数据大小的增加,它会变得高效吗?不,它会有效吗?不会。如果只有一个用户与您选择的用户分享了一个节目,并且他们观看了一个热门节目,那么该热门节目将上升到排名前列。

我会推荐

a) 回顾你对推荐节目的看法

b) 定期计算结果,而不是按需执行。

于 2012-06-29T08:49:22.623 回答