#php #mysql
#php #mysql
Вопрос:
Я пытаюсь подсчитать количество сообщений, полученных каждым пользователем. У меня есть пользователи с информацией id, name
о пользователе и т.д. Я создал другую таблицу users_msgs
, в которой у меня есть id, msg_id, user_id
. Я хочу отобразить количество сообщений, полученных каждым пользователем. каков будет наилучший способ сделать это?
У веб-приложения более 2000 пользователей. таким образом, скрипт должен выбрать их все и подсчитать их сообщения. Я думаю, что это не лучшее решение.
Я думаю о подсчете строк для 1 пользователя из users_msgs
таблицы в качестве подсчета, а затем запрашиваю в таблице users имя пользователя с его идентификатором из users_msgs
таблицы.
Я попытался выбрать всех пользователей без каких-либо ограничений:
SELECT * FROM users
затем повторяем результаты следующим образом:
<?php
while ($user = mysqli_fetch_assoc($users)) {
$count = count_user_msgs($user['id']);
echo "{$user['name']} messages: $count";
}
?>
count_user_msgs
Функция выглядит следующим образом:
<?php
$sql = "SELECT COUNT(id) as msgs_count FROM users_msgs WHERE user_id = ?";
$stmt = mysqli_stmt_init($db);
if (mysqli_stmt_prepare($stmt, $sql)) {
mysqli_stmt_bind_param($stmt, 's', $user_id);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$count = mysqli_fetch_assoc($result)['msgs_count'];
return $count;
}
return false;
?>
Ответ №1:
Вам нужно сгруппировать по каждому пользователю и получить количество:
$sql = "SELECT user_id, name, count(user_id) as msgs_count from table group by (user_id, name)";
$result = $mysqli->query($query)
while ($user = mysqli_fetch_assoc($users)) {
$user_id = $users['user_id'];
$msgs_count= $users['msgs_count'];
$count[$user_id] = $msgs_count;
echo "{$user['name']} messages: $msgs_count";
}
Ответ №2:
FWIW, вы можете получить это в одном запросе…
SELECT u.name, count(m.user_id) message_count
FROM users u
LEFT JOIN users_messages m ON u.user_id=m.user_id
GROUP BY m.user_id, u.name
Ответ №3:
Вы хотите подсчитать количество msg_id
s на user_id
, поэтому вы захотите GROUP BY user_id
и посчитаете msg_id
, вот так:
$sql = "SELECT COUNT(msg_id) as msgs_count FROM user_msgs WHERE user_id = ? GROUP BY user_id";
Это GROUP BY
может быть необязательно.
Комментарии:
1. Это приведет к подсчету сообщений с идентификатором пользователя. поэтому мне все равно нужно перебрать всех пользователей, чтобы получить их идентификатор.