1

「統計」テーブルに値の負荷を追加するこのクエリがあります。クエリが実行されると、値が選択されてサブクエリのテーブルに入力されます。これをもっと効率的にできるのか、それとも本当に間違ったことをしているのかと思っていました。私はMySQLに精通していないので、どんな助けでも素晴らしいでしょう:)

クエリは次のとおりです。

UPDATE mediastats SET 
    mediastats_members = (SELECT count(*) FROM status WHERE status_media_id = :id),
    mediastats_avscore = (SELECT AVG(status_rating) FROM status WHERE status_media_id = :id),
    mediastats_done = (SELECT count(*) FROM status WHERE status_status = 'done' AND status_media_id = :id),
    mediastats_doing = (SELECT count(*) FROM status WHERE status_status = 'doing' AND status_media_id = :id),
    mediastats_redoing = (SELECT count(*) FROM status WHERE status_status = 'redoing' AND status_media_id = :id),
    mediastats_dropped = (SELECT count(*) FROM status WHERE status_status = 'dropped' AND status_media_id = :id),
    mediastats_wantto = (SELECT count(*) FROM status WHERE status_status = 'wantto' AND status_media_id = :id),
    mediastats_wont = (SELECT count(*) FROM status WHERE status_status = 'wont' AND status_media_id = :id),
    mediastats_stalled = (SELECT count(*) FROM status WHERE status_status = 'stalled' AND status_media_id = :id),
    mediastats_rating_1 = (SELECT count(*) FROM status WHERE status_rating = 1 AND status_media_id = :id),
    mediastats_rating_2 = (SELECT count(*) FROM status WHERE status_rating = 2 AND status_media_id = :id),
    mediastats_rating_3 = (SELECT count(*) FROM status WHERE status_rating = 3 AND status_media_id = :id),
    mediastats_rating_4 = (SELECT count(*) FROM status WHERE status_rating = 4 AND status_media_id = :id),
    mediastats_rating_5 = (SELECT count(*) FROM status WHERE status_rating = 5 AND status_media_id = :id),
    mediastats_rating_6 = (SELECT count(*) FROM status WHERE status_rating = 6 AND status_media_id = :id),
    mediastats_rating_7 = (SELECT count(*) FROM status WHERE status_rating = 7 AND status_media_id = :id),
    mediastats_rating_8 = (SELECT count(*) FROM status WHERE status_rating = 8 AND status_media_id = :id),
    mediastats_rating_9 = (SELECT count(*) FROM status WHERE status_rating = 9 AND status_media_id = :id),
    mediastats_rating_10 = (SELECT count(*) FROM status WHERE status_rating = 10 AND status_media_id = :id)
    WHERE mediastats_media_id = :id

:id は PHP から追加されます。

4

2 に答える 2

1
UPDATE  (
        SELECT  status_media_id,
                COUNT(*) AS cnt, AVG(status_rating) AS avg_rating,
                SUM(status_status = 'done') AS cnt_done,
                ...
        FROM    status
        WHERE   status_media_id = :id
        ) s
JOIN    mediastats ms
ON      ms.mediastats_media_id = s.status_media_id
SET     ms.mediastats_members = cnt,
        ms.mediastats_avscore = avg_rating,
        ms.mediastats_done = cnt_done,
        ...
于 2013-04-16T16:56:04.860 に答える