我正在研究具有以下条件的评级系统:
有一些用户,他们的信息存储在users表中,每个用户都有一些由访问者评分的图像(从 0 到 10),图像存储在images表中,rates存储在 rates 表中。
现在我想在特定的一天获得评价最高(平均率)的图像,所以我写了这个查询:
SELECT
images.id AS iid,
images.id,
images.uid,
images.path,
images.sdate,
images.croped,
users.id,
users.provider,
users.twitterid,
users.username,
users.token,
users.secret,
users.`name`,
users.born,
users.height,
users.hair,
users.location,
users.eyes,
users.sdate,
COALESCE(x.cnt, 0) AS cnt,
COALESCE(x.arate, 0) AS arate,
x.lastdate
FROM images
LEFT OUTER JOIN (SELECT r.imageid,COUNT(r.id) as cnt,AVG(r.rate) AS arate,MAX(r.sdate) as lastdate FROM rates r GROUP BY r.imageid) x ON x.imageid = images.id
LEFT OUTER JOIN users on images.uid=users.id
ORDER BY
arate DESC, cnt DESC,x.lastdate DESC
LIMIT 10
但它在执行上有一些问题并且需要很长时间才能执行!我认为它的主要问题在这里:
ORDER BY
arate DESC, cnt DESC,x.lastdate DESC
你能找到这个查询的问题吗?
你可以在这里看到我的数据库的结构:
http://sqlfiddle.com/#!2/bc984/1
**编辑*
添加了解释结果:
1 PRIMARY images ALL 70195 Using temporary; Using filesort
1 PRIMARY <derived2> ALL 1743
1 PRIMARY users eq_ref PRIMARY PRIMARY 4 twitter.images.uid 1
2 DERIVED r index imageid 4 17776