два стола — posts
а также users
колонка posts.user
совпадает с users.id
,
Я хочу посчитать все сообщения от всех пользователей, таким образом:
user1 5
user2 3
user3 9
… и так далее, что означает, что user1
от users
имеет 5 экземпляров из posts
… так далее.
$items = '';
$sql = "select users.name, posts.user from users inner join posts on users.id = posts.user";
$stmt = $db->query($sql);
while($row = $stmt->fetch()){
$count = $stmt->rowCount();
$items .= "<div><span class='spanuser'>" . $row['name'] . "</span> <span class='spancount'>" . $count . "</span></div>";
}
echo $items;
результат
user1 74 // 74 is total number of `posts` rows
user2 74
user3 74
... all users - 74
Любая помощь?
Вам нужно использовать GROUP BY
с LEFT JOIN
Например:
SELECT u.name, COUNT(p.id) AS `count`
FROM users u LEFT JOIN posts p ON u.id = p.user
GROUP BY u.name;
Это даст вам желаемый результат.
Обновить
Согласно нашему обсуждению, чтобы получить счет на сегодня, вы можете использовать следующий запрос:
SELECT u.name, COUNT(p.id) AS `count`
FROM users u LEFT JOIN posts p ON u.id = p.user
WHERE DATE(datetime) = DATE(NOW())
GROUP BY u.name;
Точно так же вы можете использовать BETWEEN
Оператор, чтобы получить тот же счет для диапазона дат, например, за последние 7 дней, вы можете использовать это:
SELECT u.name, COUNT(p.id) AS `count`
FROM users u LEFT JOIN posts p ON u.id = p.user
WHERE DATE(datetime) BETWEEN DATE_ADD(NOW(), INTERVAL -7 DAY) AND DATE(NOW())
GROUP BY u.name;
Также вам необходимо обновить php
использовать count
возвращается по запросу, а не rowCount
Например:
$items .= "<div><span class='spanuser'>" . $row['name'] . "</span> <span class='spancount'>" . $row['count'] . "</span></div>";
Попробуйте сделать это таким образом, используя Count()
$items = '';
$sql = "SELECT u.name,COUNT(p.user) as pCount FROM users u INNER JOIN posts p on u.id = p.user GROUP BY u.name";
$stmt = $db->query($sql);
while($row = $stmt->fetch()){
$items .= "<div><span class='spanuser'>" . $row['name'] . "</span> <span class='spancount'>" . $row['pCount'] . "</span></div>";
}
echo $items;
Попробуйте использовать COUNT (). Посчитать posts.user
Вы хотите сгруппировать по пользователю и посчитать количество сообщений, чтобы получить итоговую итоговую строку, которую вы хотите WITH ROLLUP
например
SELECT COALESCE(User,'TOTAL') AS Name,
Count(Post.ID) AS CountOfPosts
FROM Users
LEFT JOIN Posts ON Posts.USer= Users.id
GROUP BY Users.id WITH ROLLUP
Строка «итого» на самом деле будет иметь значение ноль, поэтому мы используем COALESCE
превратить ноль в ИТОГО