我正在制作包含某些歌曲的列表。每首歌曲都有自己唯一的 ID。好的,假设我有这张表名为list
. 一个新的:
ID 是不言自明的。它用于标识行。song_one
throughsong_ten
填充了歌曲的唯一 ID。
每次用户制作新的list
时,他们都会添加歌曲并且每一行都会被填满。现在,如何list
使用填充在song_one
through之间的歌曲 ID 获得表格中歌曲的平均排名song_ten
?
重新设计您的数据库。用 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
请按照其他人所说的规范化您的数据库结构。但是,如果您希望继续此设计,则可以使用这个看起来很笨重的解决方案:
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
我会听@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)
如果你想创建一个排名系统,你可以通过代码来实现。在某些情况下,完全取决于您的设计,您会有一张桌子,但它也是通用的。