1

私はこの条件で評価システムに取り組んでいます:

何人かのユーザーがいて、その情報はusersテーブルに保存されています。各ユーザーには、訪問者によって評価された (0 から 10 までの) いくつかの画像があり、画像はimagesテーブルに保存され、料金は rate テーブルに保存されています。

ここで、特定の日の最高評価 (平均レート) の画像を取得したいので、次のクエリを書きました。

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

**編集*

Expalin の結果が追加されました。

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   
4

0 に答える 0