2

次の表を検討してください。

users                    messages
-------------------      ----------------------
user_id avg_quality      msg_id user_id quality
-------------------      ----------------------
1                        1      1       1
2                        2      1       0
3                        3      1       0
                         4      1       1
                         5      1       1
                         6      2       0
                         7      2       0
                         8      3       1

messages.qualityまたはのいずれ01です。ユーザーごとの平均メッセージ品質を計算し、users.avg_qualityそれに応じて更新する必要があります。したがって、目的の出力は次のようにusersテーブルを変更します。

users
-------------------
user_id avg_quality  <-- DECIMAL (8,2)
-------------------
1       0.60         <-- (3x1 + 2x0) / 5
2       0.00         <-- (2x0) / 2
3       1.00         <-- (1x1) / 1

私はこのようにクエリを開始しました。構文が正しくないことはわかっていますが、それ以上のアイデアはありません。あなたは?

UPDATE messages m, users u
SET avg_quality = (SELECT COUNT(m.msg_id) / SUM(m.quality))
WHERE m.user_id = u.user_id
4

2 に答える 2

1

平均関数を参照してください。

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_avg

選択は次のようになります。

select user_id, AVG(quality) from messages group by user_id

空のusersテーブルから始める場合は、次のようなクエリを実行してすべてを更新できます。

insert into users (user_id, avg_quality)
select m.user_id, coalesce(AVG(m.quality),0) from messages m group by m.user_id

継続的な結果が必要な場合は、Lucの提案が役立ちます。

update users u left join (
    select m.user_id, AVG(m.quality) as average from messages m group by m.user_id  
) as average_result_t on u.user_id = average_result_t.user_id
set u.average = coalesce(average_result_t.average,0)
于 2012-07-25T09:58:49.930 に答える
1

これは機能するはずです:

UPDATE users u
       INNER JOIN (SELECT a.user_id, AVG(quality) avg_quality 
                   FROM messages a
                        INNER JOIN users b
                            ON a.user_id = b.user_id
                   GROUP BY a.user_id
                  ) tmp
                  ON u.user_id = tmp.user_id
SET u.avg_quality = tmp.avg_quality;
于 2012-07-25T10:00:12.037 に答える