Как подсчитать сообщения для пользователя с помощью php и mysql

#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. Это приведет к подсчету сообщений с идентификатором пользователя. поэтому мне все равно нужно перебрать всех пользователей, чтобы получить их идентификатор.