2010-05-03 100 views
1

我刚刚建立了一个网站,并意识到我需要有一个前3名评分最高的专辑..我没有建立一些跟踪评级的东西。评分分开存储。有人可以告诉我如何把它们放在一起。帮助MySQL加入声明

SELECT ID,名字从专辑限时3

选择等级评级从其中URL = CONCAT(相册/显示/',album.id)

让我割肉出来一点。我需要找回以下内容:

来自相册表。 ID,名称。从收视表中我需要找回平均评分。 ROUND((评分+评分+评分)/总评分)

评分。用户可以对我网站上的所有内容进行评分,因此我有一个通用评级表评分与它所应用的网页的网址一起存储。因此,要获得专辑评分,我需要“专辑/演出/ {album_id}”。在后面我应该有一个类型和ID字段,但现在有点晚,午餐iminient。

任何帮助,非常感谢。

+1

你可以添加相册ID的收视率表的事情吗?这会让你的加入**更有效率。 'CONCAT'('albums/show /',a.id)'在连接中会导致性能下降 – lexu 2010-05-03 11:18:55

回答

2
SELECT 
    a.id, 
    a.name, 
    AVG(r.rating) AS average 
FROM 
    albums a 
    LEFT JOIN 
    ratings r 
    ON 
    r.url = CONCAT('albums/show/', a.id) 
GROUP BY 
    a.id 
ORDER BY 
    average DESC 
LIMIT 3 

(未经测试,见AVG()

+0

Genius,非常感谢你+1 – JasonS 2010-05-03 11:20:55

+0

@JasonS非常欢迎你。考虑将ID和“参考名称”(例如,“专辑”)重构为“收视率”表以优化查询。另外,如果还没有3个评级的专辑,可以考虑在'ORDER'子句中附加',a.id DESC'以强制二级排序。 – jensgram 2010-05-03 11:23:50