我正在製作某些歌曲的列表。每首歌都有自己獨特的ID。好吧,讓我們說我有這個表list
。新:MySQL - 獲得列中的平均值
ID是不言自明的。它用於ID行。 song_one
到song_ten
中充滿了歌曲的唯一ID。
每次用戶新建一個list
時,它們會添加歌曲,並且每行都會被填充。現在,如何使用在song_one
到song_ten
之間填充的歌曲ID來獲得表list
中歌曲的平均排名?
我正在製作某些歌曲的列表。每首歌都有自己獨特的ID。好吧,讓我們說我有這個表list
。新:MySQL - 獲得列中的平均值
ID是不言自明的。它用於ID行。 song_one
到song_ten
中充滿了歌曲的唯一ID。
每次用戶新建一個list
時,它們會添加歌曲,並且每行都會被填充。現在,如何使用在song_one
到song_ten
之間填充的歌曲ID來獲得表list
中歌曲的平均排名?
重新設計您的數據庫。用songid,listid和等級製作一張新桌子。這將使你的工作變得簡單。
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
我有一張名爲「歌曲」的表格,用於存儲歌曲的名稱,藝術家,專輯等。「listid」是這個......但是排名怎麼樣? – nn2
排名意味着位置第一第二(在你的情況最多10) –
然後,你可以使用從歌曲組選擇平均(排名)由songid –
請不要爲其他人所說的關於你的正常化DB結構。如果你想不過來繼續這個設計,你可以使用這個笨重的前瞻性解決方案:
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
我會聽@馬克·拜爾斯和@謝赫扎德比拉爾,誰說過,你需要重新設計你的數據庫結構。
當你認爲在表和它們的屬性的條款,思考邏輯 - 認爲在代碼的條款。
例如:如果您正在寫入文件,創建一個通用循環來輸出所需的所有內容,或者在每次需要編寫內容時用不同的代碼段打開該文件會更容易一些。
在您的數據庫中,擁有一張表示歌曲本身(這是數據庫設計背後的一般想法)比擁有一張表示所有歌曲的表更容易。
(table) (attribute)
song
id
albumid (fk from table album)
name
title
(...etc)
list
id
songid (fk from table song)
ip
date
(...etc)
如果你想創建一個排名系統,你可以通過代碼來完成。在某些情況下,純粹取決於你的設計,你會有一個表格,但它也是通用的。
一個列表可能包含* many *歌曲;一首歌曲可能被*許多*列表包含。你爲什麼只在'lists'表中建議一個'songid'字段作爲外鍵?您需要一個交叉引用表來促進多對多的關係。 –
這不是列表表格,這是列表表格的一個例子。而不是讓所有的歌曲(這是不可能的)在列表中,它應該只被引用到一個。多對多的關係應該用另外的表格來解決。我解釋了最後兩句中的排名。 – Secko
通過'song_ten'調用名爲'song_one'的列可能表示您需要重新考慮您的數據庫設計。與這樣的設計一起工作是非常困難的,如果你以後想要將它改成前二十名,這不會是一個簡單的改變。 –
這就是問題所在。我有點衝到數據庫,但你能幫我嗎?我將如何重新設計它? – nn2
在重新設計數據庫之前,您應該學習數據庫規範化,互聯網上有關於該主題的大量資源。在閱讀了三種最相關的常規表單之後,您最有可能會發現與您的數據庫設計有關的其他問題,因此修復這個問題並不是最好的方法。 – fvu