2

3つのMySQLテーブルがあるとしましょう。songs曲のアーティスト、アルバムなどを含む、呼び出された曲db 。ここでの主なものlastfm_idは、曲のUNIQUEIDです。

次に、list(トップ10の曲のように10のスポットがあります)があります。人々は自分のリストに曲を追加してリストを作成し、それらを1から10にランク付けすることができます。このデータベースに実際に触れる必要はありません。

最後にsong_listed、リストに入れるために人々が選んだ曲があります。ここでtiは:

ここに画像の説明を入力してください

ご覧のとおり、 song_idinは表song_listedと同じです。データベースにはリストが1つしかないため、10曲あります。3つのリストが作成された場合、それぞれに30行があり、それぞれのランクは1〜10になります。lastfm_idsongssong_listed

song_listedリスト内の各曲の平均ランクを取得するにはどうすればよいですか?

list.php?id=11912経由またはそのようなものでリストを表示するページがあると想像してください。song_listed次に、どこlist_idから曲を取得し11912ます。

これが私がこれまでに得たものです:

$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());

    }
4

2 に答える 2

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による1つのリクエストが必要な場合(これは素晴らしいアイデアではありませんが)

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

注意:これは単なる「論理的な」解決策です。パラメータ化されたクエリを使用します(そしてmysql_ *関数に関するBenのコメントを読んでください)。

于 2012-07-01T11:37:43.697 に答える
1

平均ランクが正しい情報を提供することはありません-リストから2曲を想像してください-曲Aは2つのリストに存在し、毎回ランク1で、曲Bは200のリストで、毎回ランク2=>曲たとえそれがはるかに人気があるとしても、Aは平均ランク1と曲B2を持ちます

代わりに「人気」メトリックを使用することをお勧めします(たとえば、ランク1の場合は10ポイント、ランク10の場合は1ポイント)。

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
于 2012-07-01T11:57:29.430 に答える