2

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

users                messages
-----------------    -----------------------
user_id  messages    msg_id user_id content
-----------------    -----------------------
1        0           1      1       foo
2        0           2      1       bar
3        0           3      1       foobar
                     4      3       baz
                     5      3       bar

ユーザーごとのメッセージ数をカウントし、次のように結果をusers.messagesに挿入します。

users                
-----------------    
user_id  messages    
-----------------    
1        3           
2        0           
3        2           

PHPを使用して、この操作を実行できます。疑似:

foreach ($user_id in users) {
  $count = select count(msg_id) from messages where user_id = $user_id
  update users set messages = $count
}

しかし、これは、MySQLで直接実行される1つのクエリと比較すると、おそらく非常に非効率的です。

UPDATE users SET messages = (
  SELECT COUNT(msg_id) FROM messages
)

しかし、これは適切なクエリではないと確信しています。したがって、どんな助けもいただければ幸いです:-)

4

6 に答える 6

3

答えは次のとおりです。

UPDATE `users` AS u 
SET u.messages=(SELECT COUNT(*) FROM messages WHERE user_id=u.user_id)

とテスト:

http://sqlfiddle.com/#!2/2768b/1

これらが巨大なテーブルではないことを願っています。そうしないと、しばらく時間がかかる可能性があります...

更新: クエリから不要なJOINを削除しました。私の答えを修正してくれた@Arielと@Zane Bienに感謝します!

于 2012-07-11T09:37:27.333 に答える
1
UPDATE users JOIN
       (SELECT user_id, COUNT(msg_id) num FROM messages group by user_id) c
       USING (user_id)
SET users.messages = c.num

注:私はこれをテストしませんでした。

于 2012-07-11T09:13:44.647 に答える
1

MySQLでは、次のようなステートメントJOINで操作を使用できます。UPDATE

UPDATE 
    users a
LEFT JOIN
(
    SELECT user_id, COUNT(1) AS messagecount
    FROM messages
    GROUP BY user_id
) b ON a.user_id = b.user_id
SET 
    a.messages = COALESCE(b.messagecount, 0)

これにより、対応する各ユーザーをmessagesテーブル内のメッセージの数と並べることができるため、messages列の更新は、メッセージ数を含む対応する結合列を参照するだけの簡単な問題になります。

messagesユーザーがテーブルにメッセージを持っていない場合は、列をに設定するだけ0です。

また、非効率的なサブクエリ(各反復で実行される)を使用する必要がないため、これが非常に迅速に実行されること、および結合がインデックスに対して実行されることも確認できます。

于 2012-07-11T09:14:12.870 に答える
1

あなたがクエリを起動する方法を知っていると仮定すると、私はこれを言うでしょう...

メッセージがメッセージテーブルに投稿されるたびに挿入時にトリガーを作成し、行数をユーザーテーブルに挿入します。したがって、新しいメッセージを挿入するたびにphpでクエリを実行する必要はありません。したがって、新しいメッセージを挿入するたびにメッセージ数が自動的に更新され、特定のユーザーのメッセージ数を確認する場合は、selectクエリを実行するだけで済みます。

トリガードキュメント

于 2012-07-11T09:19:47.317 に答える
1

これは確かに機能します。これを試して:

UPDATE users u
 SET u.messages =
      (  SELECT COUNT (*)
           FROM messages m
       GROUP BY user_id
         HAVING u.user_id = m.user_id);
于 2012-07-11T09:35:30.793 に答える
0

これを試して::

UPDATE users u
inner join 
(
  Select user_id, count(1) as number
    from users u inner join messages m on (u.user_id=m.user_id) group by m.user_id 
) as temp_message tm on (u.user_id=tm.user_id)
set u.messages=tm.number
于 2012-07-11T09:10:37.983 に答える