2012-07-01 159 views
2

假設我有3個MySQL表。歌曲數據庫名爲songs,有一首歌曲的藝術家,專輯等。這裏主要是lastfm_id這是歌曲的唯一ID。MySQL - 獲取平均每行

然後有一個list(10斑點,像前10首歌曲)。人們可以通過將歌曲添加到列表中來創建列表,並將它們排列爲1到10.此分貝並不需要爲此而觸及。

最後,我們有song_listed這是人們挑選的歌曲被放入一個列表。這裏ti爲:

enter image description here

正如你所看到的,在song_listedsong_id是一樣的,在表songslastfm_id。現在因爲數據庫中只有一個列表,所以有10首歌曲。如果創建了3個列表,則song_listed中將有30行,各自的等級爲1-10。

如何我會得到在列表中的每首歌曲的song_listed平均排名?

想象有顯示通過list.php?id=11912或類似的東西列表的頁面。 這樣,你會從song_listed得到的歌曲,其中list_id11912

這裏就是我有這麼遠:

$listSongs = 0; 
while ($listSongs <= 9) { 

    // Don't worry, I did a query and $songID[x] works. 
    $songID = $songID[$listSongs]; // ex: 12949331 
    $getAvgRank = mysql_query("") or die(mysql_error()); 

    } 
+0

任何人都可以拋出正常的mysql_ *註釋嗎? –

+0

如果歌曲A在第一名的2個列表中,你是否希望它比第二名在200列表中的歌曲B更好? – Aprillion

+1

避免使用日期的mysql_ *函數。將它們用於新代碼的程度高達 [灰心](http://php.net/mysql_query)。 更多現代化的替代品可供選擇並更好地維護。 請考慮學習 [已準備好的陳述](http://en.wikipedia.org/wiki/Prepared_statement) 而不是使用 [PDO或MySQLi](http://php.net/manual/en/mysqlinfo。 api.choosing.php)。 當嚴格使用時,避免繁瑣和手動轉義部分,因此變得更容易堆積,因爲副產品更安全使用。 請參閱[PDO教程](http://goo.gl/vFWnC)開始。 – Ben

回答

2
SELECT song_id, AVG(rank) 
FROM song_listed 
WHERE song_id in 
    (SELECT s1.song_id FROM song_listed s1 WHERE s1.list_id = <the id of your list_id>) 
GROUP BY song_id 

編輯

,如果你想通過song_id一個請求(這是不是一個好主意,但)

SELECT AVG(rank) 
FROM song_listed 
WHERE song_id = $songID[$realArray] 

小心:這只是「合乎邏輯」的解決方案。使用參數化查詢(並閱讀Ben對mysql_ *函數的評論)。

+0

'你的SQL語法有錯誤;檢查對應於你的MySQL服務器版本的手冊,在第1行用'song_id'附近的'?)group使用正確的語法。嗯, – nn2

+1

好吧,認爲你可以通過你的參數改變'?',例如no 'gjX ....')? –

+0

Riiight。我得到這個'$ getAvgRank = mysql_query(「select song_id,AVG(rank)FROM song_listed WHERE song_id in(從song_listed s1選擇s1.song_id,其中s1.list_id = $ songID [$ realArray])by song_id」)或die mysql_error());'和我輸出爲'<?= $ getAvgRank?>',我得到'資源ID#13'或類似的東西。 – nn2

1

我不事平均排名爲您提供正確的信息 - 想象從列表中2首歌曲 - 歌曲A存在2所列出總共有1級,每次,,曲B在200名名單,與排名每一次2 =>歌曲A將具有平均等級1和歌曲B 2,即使它更受歡迎

我建議您使用「流行度」指標來代替(例如,對於等級1 ... 1分爲10分10):

select s.song_id, sum(11 - s.rank) popularity_points 
from song_listed s 
join song_listed l on s.song_id = l.song_id and l.list_id = :my_list_id 
group by s.song_id