1

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

在此处输入图像描述

ID 是不言自明的。它用于标识行。song_onethroughsong_ten填充了歌曲的唯一 ID。

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

4

3 回答 3

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
于 2012-07-01T09:42:31.117 回答
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
于 2012-07-01T09:50:21.627 回答
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)

如果你想创建一个排名系统,你可以通过代码来实现。在某些情况下,完全取决于您的设计,您会有一张桌子,但它也是通用的。

于 2012-07-01T10:10:32.150 回答