MySQL - 获取每行的平均值

时间:2012-07-01 11:31:15

标签: php mysql math

假设我有3个MySQL表。一首叫做songs的歌曲,有一首歌的艺术家,专辑等。这里的主要内容是lastfm_id,这是歌曲的独特身份。

然后有list(有10个点,就像前10首歌一样)。人们可以通过将歌曲添加到列表中来创建列表,并将它们排列为1到10.这个数据库实际上并不需要被触及。

最后,我们有song_listed这是人们选择放入列表的歌曲。这里的时间是:

enter image description here

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

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

想象一下,有一个页面通过list.php?id=11912或类似的东西显示列表。 然后,您将获得song_listed 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());

    }

2 个答案:

答案 0 :(得分: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_ *函数的评论)。

答案 1 :(得分:1)

我没有平均排名给你正确的信息 - 想象列表中的2首歌曲 - 歌曲A总共有2个列表,每次排名1,歌曲B在200个列表中,每次排名2 =&GT;歌曲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