[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Запрос к БД
savelikan
Привет всем!

SELECT *
FROM `forum_posts`
WHERE `forum_posts-users` IN (8,25,9,5)

Возможно ли узнать сколько найдено строк для каждого пользователя? Это я пишу для CRON, чтоб ночью перещитывал количество сообщений кажного пользователя на форуме

_____________
Одесса - мой город!)))
volter9
savelikan
Сначала не понял задачу. Что бы найти все посты пользователя, точнее получить кол-во постов, можно сделать такой запрос:

SELECT u.*, IFNULL(COUNT(p.id), 0) as posts
FROM users u
LEFT JOIN posts p ON (p.user_id = u.id)
WHERE posts IN (8, 25, 9, 5)


users – таблица с пользователями,
posts – таблица с форумными постами, у этой таблице должно быть поле которое связывает юзеров связью 1 к 1. А WHERE условие, как я понял, это найти пользователей у которых кол-во сообщений либо 5, 8, 9, или 25.

_____________
Мой блог
savelikan
Цитата (volter9 @ 16.01.2015 - 17:56)
savelikan
Сначала не понял задачу. Что бы найти все посты пользователя, точнее получить кол-во постов, можно сделать такой запрос:

SELECT u.*, IFNULL(COUNT(p.id), 0) as posts
FROM users u
LEFT JOIN posts p ON (p.user_id = u.id)
WHERE posts IN (8, 25, 9, 5)


users – таблица с пользователями,
posts – таблица с форумными постами, у этой таблице должно быть поле которое связывает юзеров связью 1 к 1. А WHERE условие, как я понял, это найти пользователей у которых кол-во сообщений либо 5, 8, 9, или 25.

8, 25, 9, 5 - это ИД пользователей, нужно найти количество сообщений кажного пользователя
forum_posts-users - ИД пользователя, который добавил сообщение

тоесть не нужно подключать таблицу юзеров

_____________
Одесса - мой город!)))
volter9
savelikan

Ну тогда так:
SELECT u.id, IFNULL(COUNT(p.id), 0) as posts
FROM users u
LEFT JOIN posts p ON (p.user_id = u.id)
WHERE u.id IN (8, 25, 9, 5)


Для каждого пользователя будет добавлено поле posts, кол-во сообщений на форуме.

_____________
Мой блог
savelikan
SELECT `u`.`users_id` , IFNULL( COUNT( `p`.`forum_posts-id` ) , 0 ) AS posts
FROM `users` `u`
LEFT JOIN `forum_posts` `p` ON ( `p`.`forum_posts-user` = `u`.`users_id` )
WHERE `u`.`users_id`
IN ( 2, 3, 4, 5, 52 )

в результатах отображается только результат для первого в списке пользователя (ИД -2), хотя все остальные ИД есть в базе 'users'

Если убрать , IFNULL( COUNT( `p`.`forum_posts-id` ) , 0 ) AS posts - тогда все записи есть, но чегего не считает(



ЕДИТ
Вот так будет правильно?
SELECT `u`.`users_id` , (
SELECT COUNT( `forum_posts-id` )
FROM `forum_posts`
WHERE `forum_posts`.`forum_posts-user` = `u`.`users_id`
) AS posts
FROM `users` `u`
WHERE `u`.`users_id` IN (1,52)


_____________
Одесса - мой город!)))
volter9
Цитата (volter9 @ 16.01.2015 - 20:10)
SELECT u.id, IFNULL(COUNT(p.id), 0) as posts
FROM users u
LEFT JOIN posts p ON (p.user_id = u.id)
WHERE u.id IN (8, 25, 9, 5)

Я протестировал, забыл GROUP BY u.id добавить:

SELECT u.id, IFNULL(COUNT(p.id), 0) as posts
FROM users u
LEFT JOIN posts p ON (p.user_id = u.id)
WHERE u.id IN (8, 25, 9, 5)
GROUP BY u.id


_____________
Мой блог
savelikan
А тот вариант, что я предлагал лучше?

_____________
Одесса - мой город!)))
volter9
savelikan
Тот способ тоже работает, но насчет производительности точно не знаю что быстрее, тут надо бенчмарки делать. Мне кажется что твой вариант лучше т.к. не нужно использовать GROUP BY. rolleyes.gif

Похоже что сам спросил и сам ответил.

_____________
Мой блог
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.