2

假设我有 3 个 MySQL 表。一个名为的歌曲数据库songs,其中包含歌曲的艺术家、专辑等。这里的主要lastfm_id内容是歌曲的唯一 ID。

然后是一个list(有 10 个位置,比如前 10 首歌曲)。人们可以通过将歌曲添加到他们的列表中来创建列表,并将它们从 1 到 10 排名。这个 db 并不需要为此被触及。

最后,我们有song_listed哪些歌曲是人们挑选的要放入列表的歌曲。这里 ti 是:

在此处输入图像描述

如您所见,song_idin与表中song_listed的相同。现在由于数据库中只有一个列表,因此有 10 首歌曲。如果创建了 3 个列表,则每个列表将有 30 行,它们自己的等级为 1-10。lastfm_idsongssong_listed

我如何获得song_listed列表中每首歌曲的平均排名?

想象一下有一个页面显示一个列表 vialist.php?id=11912或类似的东西。然后,您将从song_listedwhere is 获取list_id歌曲11912

这是我到目前为止得到的:

$listSongs = 0;
while ($listSongs <= 9) {

    // Don't worry, I did a query and $songID[x] works.
    $songID = $songID[$listSongs]; // ex: 12949331
    $getAvgRank = mysql_query("") or die(mysql_error());

    }
4

2 回答 2

2
SELECT song_id, AVG(rank)
FROM song_listed
WHERE song_id in 
  (SELECT s1.song_id FROM song_listed s1 WHERE s1.list_id = <the id of your list_id>)
GROUP BY song_id

编辑

如果你想要一个 song_id 的请求(这不是一个好主意,但是)

SELECT AVG(rank)
FROM song_listed
WHERE song_id = $songID[$realArray]

注意:这只是“合乎逻辑”的解决方案。使用参数化查询(并阅读 Ben 对 mysql_* 函数的评论)。

于 2012-07-01T11:37:43.697 回答
1

我不认为平均排名可以为您提供正确的信息 - 想象一个列表中的 2 首歌曲 - 歌曲 A 出现在 2 个列表中,每次排名为 1,歌曲 B 出现在 200 个列表中,每次排名为 2 => 歌曲A 的平均排名为 1,歌曲 B 为 2,即使它更受欢迎

我建议您改用“受欢迎程度”指标(例如,排名 1 的 10 分 ...排名 10 的 1 分):

select s.song_id, sum(11 - s.rank) popularity_points
from song_listed s
join song_listed l on s.song_id = l.song_id and l.list_id = :my_list_id
group by s.song_id
于 2012-07-01T11:57:29.430 回答