2012-06-26 81 views
0

首先,我對MySQL不太好,所以對我來說很容易。我甚至不知道如何說出我的問題。MySQL表加入平均排序

我有兩個表;一個表格包含有關鏈接的信息,以及用戶製作的每個鏈接的其他評分。基本上,我只需要能夠按照評分平均值排序鏈接表。

表:

鏈接

  • link_id PK INT自動增量
  • 網址VARCHAR
  • 標題VARCHAR
  • 描述文本
  • 評級小數

link_ratings

  • link_rating_id PK INT自動增量
  • link_id FK詮釋
  • user_i d FK詮釋
  • 評級小數

我所需要的,當有人將鏈接添加評級鏈接(新link_ratings條目)或更新它們的額定電流,所有該鏈接的收視率都是在鏈接中的評級列上平均並更新。或者我可以完全刪除鏈接表中的評級列,並使用JOIN?

如果是這樣,我將如何去做JOIN。如果不是,我該如何讓TRIGGER爲我做到這一點?

我一直無法找到很多信息,很可能是由於我缺乏SQL知識,甚至無法啓動。

任何幫助表示讚賞。謝謝。

+0

請提供樣本數據和所需輸出。 – RedFilter

回答

3

您不需要在links表中保留rating的平均值。我正在計算下面,這應該表現相當好:

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 
+0

其實,我試圖總結和平均的價值是link_ratings中的評分。錶鏈接中的每個鏈接都有許多鏈接條目。 – ahhchuu

+0

已更新爲使用「評級」。 – RedFilter

+0

太棒了。這正是我所需要的。非常感謝。有一點需要澄清:l => link和lra => link_ratings是正確的嗎?這只是取代名字? – ahhchuu

1

正確的數據設計會告訴你實際上並不存儲平均評級。在大多數情況下,MySQL可以很快計算出來。將您的所有link_ratings但是當談到時間使用MySQL AVG() function.

但是,如果你確實需要每次都觸發,檢查出MySQL's TRIGGER Documentation顯示實際收視率,加入link_ratingslinks並計算平均值。類似以下未經測試的僞代碼將幫助您

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; 
+0

我希望我不需要存儲平均值。很高興看到我沒有。感謝您的信息和鏈接。我會研究TRIGGERS,所以當我確實需要它們時,我會更好地理解。 – ahhchuu