2

この(一種の)作業クエリをより動的にする助けが必要です。

myShows、TVShows、Users の 3 つのテーブルがあります。

  • マイショー
    • ID(PK)
    • ユーザー (ユーザーへの FK)
    • 番組 (FK から TVShows)

このクエリを取得して、ユーザー 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 アプリケーションに使用されます。私は現在、1 時間あたり約 130,000 ヒットを取得するムービー API (IMDbAPI.com) を実行しており、高速に実行するために多くのデータベース/コードの最適化を行う必要がありました。再度、感謝します!

テスト用のデータベース スキーマが必要な場合は、お知らせください。

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 プラットフォームがWITHCommon Table Expressions をサポートしている場合、上記を最適化してそれらを使用できます。

データサイズが大きくなると効率的ですか?いいえ、効果はありますか?いいえ。1 人のユーザーが選択したユーザーと番組を共有し、そのユーザーが人気のある番組を視聴した場合、その人気のある番組がランキングのトップに上がります。

お勧めします

a) ショーを推奨するものについての考えを確認する

b) オンデマンドで実行するのではなく、定期的に結果を計算します。

于 2012-06-29T08:49:22.623 に答える