我正在制作包含某些歌曲的列表。每首歌都有自己独特的ID。好吧,假设我有一个名为list
的表。一个新的:
ID不言自明。它用于ID行。 song_one
到song_ten
填充了歌曲的唯一ID。
每次用户制作新的list
时,他们都会添加歌曲,每行都会被填充。现在,我如何使用在list
到song_one
之间填充的歌曲ID来获得表song_ten
中歌曲的平均排名?
答案 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)
如果您想创建排名系统,可以通过代码完成。在某些情况下,完全取决于你的设计,你会有一个表格,但它也是普遍的。