MySQL - 获取列中的平均值

时间:2012-07-01 09:37:50

标签: php mysql math

我正在制作包含某些歌曲的列表。每首歌都有自己独特的ID。好吧,假设我有一个名为list的表。一个新的:

enter image description here

ID不言自明。它用于ID行。 song_onesong_ten填充了歌曲的唯一ID。

每次用户制作新的list时,他们都会添加歌曲,每行都会被填充。现在,我如何使用在listsong_one之间填充的歌曲ID来获得表song_ten中歌曲的平均排名?

3 个答案:

答案 0 :(得分:5)

重新设计您的数据库。用songid,listid和rank创建一个新表。这将使您的工作变得轻松。

listsongs
-----------------
songid [PK] -- Foreign key referencing the songs table
listid [PK] -- Foreign key referencing the lists table
rank

选择平均歌曲排名:

SELECT
    a.song_id
    AVG(b.rank) AS avgrank
FROM
    songs a
LEFT JOIN
    listsongs b PM a.song_id = b.song_id
GROUP BY
    a.song_id

答案 1 :(得分:1)

请像其他人所说的那样对数据库结构进行规范化。但是,如果您希望继续使用此设计,可以使用这种看起来很笨重的解决方案:

SELECT 
    a.song_id,
    AVG(
        CASE
            WHEN a.song_id = b.song_one THEN 1
            WHEN a.song_id = b.song_two THEN 2
            WHEN a.song_id = b.song_three THEN 3
            WHEN a.song_id = b.song_four THEN 4
            WHEN a.song_id = b.song_five THEN 5
            WHEN a.song_id = b.song_six THEN 6
            WHEN a.song_id = b.song_seven THEN 7
            WHEN a.song_id = b.song_eight THEN 8
            WHEN a.song_id = b.song_nine THEN 9
            WHEN a.song_id = b.song_ten THEN 10
        END
    ) AS AvgRank
FROM
    songs a
INNER JOIN
    list b ON 
        a.song_id IN 
        (
            b.song_one,
            b.song_two,
            b.song_three,
            b.song_four,
            b.song_five,
            b.song_six,
            b.song_seven,
            b.song_eight,
            b.song_nine,
            b.song_ten
        )
GROUP BY
    a.song_id

答案 2 :(得分:1)

我会听@ Mark Byers 和@ Shehzad Bilal ,他们说你需要重新设计你的数据库结构。

当您根据表格及其属性进行思考时,请考虑逻辑 - 在代码方面进行思考。

例如:如果你正在写一个文件,那么创建一个通用循环来输出所需的所有东西,或者每次你需要写东西时用不同的代码段打开文件会更容易吗?

在你的数据库中,拥有一个代表歌曲本身的表(这是数据库设计背后的总体思路)比拥有代表所有歌曲的表更容易。

(table) (attribute)
 song
         id
         albumid (fk from table album)
         name
         title
         (...etc)
 list
         id
         songid (fk from table song)
         ip
         date
         (...etc)

如果您想创建排名系统,可以通过代码完成。在某些情况下,完全取决于你的设计,你会有一个表格,但它也是普遍的。