[英]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.