0

まず第一に、私はまだ MySQL にあまり慣れていないので、気楽にやってください。私の質問をどのように表現するかさえわかりません。

2 つのテーブルがあります。1 つのテーブルにはリンクに関する情報が含まれ、他のテーブルにはユーザーによる各リンクの評価が含まれます。基本的に、評価平均でリンク テーブルを並べ替えることができればよいだけです。

表:

リンク

  • link_id PK int 自動インクリメント
  • URL varchar
  • タイトル varchar
  • 説明 テキスト
  • 評価小数

link_ratings

  • link_rating_id PK int 自動インクリメント
  • link_id FK int
  • user_id FK int
  • 評価小数

私が必要とするのは、誰かがリンクにリンク評価を追加する (新しい link_ratings エントリ) か、現在の評価を更新すると、そのリンクのすべての評価が平均化され、リンクの評価列で更新されることです。または、リンク テーブルの評価列を完全に破棄して JOIN を使用できますか?

もしそうなら、どのようにJOINを行うのですか?そうでない場合、これを実現する TRIGGER をどのように作成すればよいですか?

おそらくSQLの知識が不足しているため、これを開始する方法についても、多くの情報を見つけることができませんでした。

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

3

テーブルにrating平均を保持する必要はありません。links以下で計算していますが、これはかなりうまく機能するはずです。

select l.link_id,
    l.url,
    l.title,
    l.description,
    lra.AvgRating
from links l
left outer join (
    select link_id, avg(rating) as AvgRating
    from link_ratings
    group by link_id
) lra on l.link_id = lra.link_id
order by lra.AvgRating desc
于 2012-06-26T16:38:47.657 に答える
1

適切なデータ設計では、実際には平均評価を保存しないように指示されます。ほとんどの場合、MySQL はこれを十分に迅速に計算できます。すべてを保持しますlink_ratingsが、実際の評価を表示するときが来たら、結合link_ratingsしてMySQL関数linksを使用して平均を計算します。AVG()

ただし、毎回トリガーする必要がある場合は、MySQL の TRIGGER ドキュメントを確認してください。次のテストされていない疑似コードのようなものが役立ちます

CREATE TRIGGER trig AFTER UPDATE ON link_ratings
  FOR EACH ROW BEGIN
    UPDATE links
    SET links.rating = <new average>
    WHERE links.link_id = NEW.link_id;
  END;
于 2012-06-26T16:43:09.170 に答える