簡體   English   中英

計算每個用戶的郵件數

[英]Count number of messages per user

請考慮以下表格:

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中執行的一個查詢相比,這可能效率很低:

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

但是我確定這不是一個正確的查詢。 因此,任何幫助將不勝感激:-)

這是答案:

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糾正了我的答案!

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

注意:我沒有對此進行測試。

MySQL允許您在UPDATE語句中使用JOIN操作,如下所示:

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

您還可以確保這將很快執行,因為不需要使用效率低下的子查詢(最終將在每次迭代中執行),並且不需要對索引執行聯接。

假設您知道如何觸發查詢,我會這樣說...

每當將一條消息發布到消息表中時,就在插入時創建一個觸發器,並將行數插入到用戶表中。 因此,您不必在每次插入新消息時都通過php觸發查詢。 因此,無論何時插入新消息,您的消息數都將自動更新,當您要檢查特定用戶的消息數時,只需觸發選擇查詢即可。

觸發文檔

這肯定會工作。 嘗試這個:

UPDATE users u
 SET u.messages =
      (  SELECT COUNT (*)
           FROM messages m
       GROUP BY user_id
         HAVING u.user_id = m.user_id);

嘗試這個::

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM