【问题标题】:Trending SQL Query趋势 SQL 查询
【发布时间】:2012-02-15 03:21:05
【问题描述】:

所以我要做的是制作一个趋势算法,我需要 SQL 代码方面的帮助,因为我无法让它运行。

算法有三个方面:(我对更好的趋势算法完全持开放态度)

1.Plays during 24h / Total plays of the song
2.Plays during 7d / Total plays of the song 
3.Plays during 24h / The value of plays of the most played item over 24h (whatever item leads the play count over 24h)

每个方面的值应为 0.33,最大值为 1.0 是可能的。

第三个方面是必要的,因为新上传的项目会自动排在首位,除非他们可以将它们放下。

该表名为 aud_plays 列是:

PlayID: Just an auto-incrementing ID for the table
AID: The id of the song
IP: ip address of the user listening
time: UNIX time code

我已经尝试了一些 sql 代码,但我非常坚持无法让它工作。

【问题讨论】:

  • 很抱歉,您能说得更详细些吗?我只听到算法、.33 和 SQL。
  • 当然,我想要一个 SQL 查询来确定哪一首歌与其他歌曲相比更流行。我想到的是三个值,每个值最大值为 0.33。这三个值的总和将被排序以确定趋势最高的歌曲。目前我希望查询的三个 0.33 值由歌曲的 24 小时播放次数/总播放次数、7 天播放次数/歌曲总播放次数和 24 小时播放次数/24 小时播放次数最多的歌曲确定24小时
  • 能贴出你试过的SQL代码吗?

标签: php mysql sql algorithm trend


【解决方案1】:

在您的 ?aud_songs 中? (AID 指向的那个)表添加以下列

  • Last24hrPlays INT -- 如果您打算获得十亿以上,请使用 BIGINT
  • Last7dPlays INT
  • TotalPlays INT

在您的 aud_plays 表中创建一个 AFTER INSERT 触发器,该触发器将增加 aud_song.TotalPlays。

UPDATE aud_song SET TotalPlays = TotalPlays + 1 WHERE id = INSERTED.aid

实时计算每个请求的趋势会对您的服务器造成负担,因此最好每约 5 分钟运行一次更新数据的作业。因此,创建一个 SQL 代理作业,每 X 分钟运行一次,更新 Last7dPlays 和 Last24hrPlays。

UPDATE aud_songs SET Last7dPlays = (SELECT COUNT(*) FROM aud_plays WHERE aud_plays.aid = aud_songs.id AND aud_plays.time BETWEEN GetDate()-7 AND GetDate()), 
    Last24hrPlays = (SELECT COUNT(*) FROM aud_plays WHERE aud_plays.aid = aud_songs.id AND aud_plays.time BETWEEN GetDate()-1 AND GetDate())

我还建议从 aud_plays 中删除旧记录(可能早于 7 天,因为您将拥有 TotalPlays 触发器。

应该很容易弄清楚如何计算您的 1 和 2(从问题中)。这是 3 的 SQL。

SELECT cast(Last24hrPlays as float) / (SELECT MAX(Last24hrPlays) FROM aud_songs) FROM aud_songs WHERE aud_songs.id = @ID

注意我使 T-SQL 非常通用且未经优化,以说明该过程的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-27
    相关资源
    最近更新 更多