1

特定の曲でリストを作成しています。各曲には固有の ID があります。OK という名前のテーブルがあるとしましょうlist。新しい:

ここに画像の説明を入力

IDは自明です。行の ID に使用されます。song_onethroughsong_tenには曲の一意の ID が入ります。

ユーザーが新しい を作成するたびlistに、曲を追加し、各行がいっぱいになります。では、 ~listの間に埋められた曲の ID を使用して、テーブル内の曲の平均ランクを取得するにはどうすればよいでしょうか?song_onesong_ten

4

3 に答える 3

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
于 2012-07-01T09:42:31.117 に答える
1

データベース構造を再設計する必要があると言った@ Mark Byersと @ Shehzad Bilalに耳を傾けます。

テーブルとその属性の観点から考えるときは、論理的に考えてください。つまり、コードの観点から考えてください。

例: ファイルに書き込みを行っている場合、必要なものをすべて出力するユニバーサル ループを作成するか、何かを書き込む必要があるたびに異なるコードでファイルを開く方が簡単でしょうか。

データベースでは、すべての曲を表すテーブルを使用するよりも、曲自体を表す 1 つのテーブルを使用する方が簡単です (データベース設計の背後にある一般的な考え方です)。

(table) (attribute)
 song
         id
         albumid (fk from table album)
         name
         title
         (...etc)
 list
         id
         songid (fk from table song)
         ip
         date
         (...etc)

ランキング システムを作成する場合は、コードを使用します。場合によっては、純粋にデザインに応じてテーブルを用意することもありますが、それは普遍的なものでもあります.

于 2012-07-01T10:10:32.150 に答える
1

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
于 2012-07-01T09:50:21.627 に答える