Нужен мудреный запрос

php5

Новичок
Нужен мудреный запрос

имеется таблица
CREATE TABLE `chat` (
`id_chat` int(11) NOT NULL auto_increment,
`date_read` int(11) NOT NULL default '0',
`date_writ` int(11) NOT NULL default '0',
`id_to` int(11) NOT NULL default '0',
`id_from` int(11) NOT NULL default '0',
`mes` text,
PRIMARY KEY (`id_chat`)
)
Необходимо подсчитать сколько всего сообщений у каждого пользователя т.е необходимо подсчитать сколько пользователь отправил и получил сообщений. Поле id_from –это кто отправил сообщение , а id_to –кому это сообщение отправлено

К примеру имеется 2 пользователя
1-й отпр. 2 сооб. 2-му
2-й отпр. 1 сооб. 1-му
Тогда для 1-го всего сообщений 3, и у второго 3

Как это сделать в одном запросе
 

phprus

Moderator
Команда форума
php5
Если тебе не нужно считать отдельно количество принятых и отправленных сообщений, то ты решишь задачу используя COUNT для подсчета числа записей и OR в условии для выбора этих записей.

Если тебе нужно считать отдельно количество принятых и отправленных сообщений, то эту задачу легко решить в 2 запроса. Зачем их объединять в один мне не понятно.
 

php5

Новичок
Мне нужно подсчитать сколько всего пользователь отправил и получил сообщений
Причем для этого нужно использовать только таблицу chat не используя таблицу где определены все id пользователей в итоге нужно получить id пользователей из таблицы chat и для каждого из них общее количество сообщений
Phprus, можешь написать такой запрос а то у меня бошка уже не варит
 

tf

крылья рулят
Phprus, можешь написать такой запрос а то у меня бошка уже не варит
а может мы вздохнем, глупоко, поприсидаем и сновыми силами попробуем конкретно описать на бумаге задачу в математическом виде?

-~{}~ 16.08.07 19:35:

ps/ кстати надеюсь phprus ответит на просьбу - нет
 

kruglov

Новичок
[sql]
select
users.id,
count(sent.id_chat) as messages_sent,
count(received.id_chat) as messages_received,
from users
left join chat as sent on users.id=sent.id_from
left join chat as received on users.id=received.id_to
group by users.id
[/sql]

-~{}~ 16.08.07 21:00:

p.s. А почему не надо использовать таблицу с собственно юзерами?
Не, и без нее можно (джойнить на первом месте не таблицу с юзерами, а таблицу chat с distinctом), но задача из реальной становится "странной".
 

Wicked

Новичок
kruglov
[sql]SELECT users.id, count( sent.id_chat ) AS messages_sent, count( received.id_chat ) AS messages_received, [/sql]
если один человек отправил 2 сообщения, а принял 3 сообщения, то оба значения будут = 6 :)
 

Wicked

Новичок
ну и возможны варианты типа такого...
[sql]select chat.id_from, count(*), "sent" from chat group by chat.id_from union all
select chat.id_to, count(*), "received" from chat group by chat.id_to[/sql]
 

phprus

Moderator
Команда форума
tf
ps/ кстати надеюсь phprus ответит на просьбу - нет
Максимум, что ответит phprus, это то что он непонял почему в задаче нельзя использовать таблицу с пользователями. Какое-то странное ограничение.

P.S. Кроме того phprus когда отвечал думал, что нужно посчитать количество сообщений у определенного пользователя, но если бы можно было приJOINить таблицу с пользователями, то запрос для одного пользователя легко модифицировался бы в запрос для всех пользователей.

Хотя метод kruglovа:
(джойнить на первом месте не таблицу с юзерами, а таблицу chat с distinctом)
тоже работающий, но я бы до такого метода не додумался.

НО если не использовать таблицу с пользователями, то мы не сможем получить количество сообщений у пользователей не получавших и не отправлявших сообщений. Тоесть их вообще не будет в результате и мы не сможем запросами без использования таблицы всех пользователей получить для этих пользователей значение 0.
 

Wicked

Новичок
может уже забудем про необоснованные предрассудки топикстартера насчет таблицы users? Либо, php5, обоснуйте :)
 

php5

Новичок
Я не хочу использовать таблицу users потому что мне нужно подситать сообщеняи только для тех пользователей которые либо писали , либо получали сообщения поэтому перебирать всех пользователей из таблицы users нет резона
 

php5

Новичок
Я в следующий запрос :
PHP:
SELECT user.id_user,user.status, user.name,user.email,user.lastname,user.dateact,user.num_pact, 
                   count( distinct  sent.id_chat ) AS mes_sent, count( distinct received.id_chat ) AS mes_received,
                   count( distinct noread.id_chat )as notread
                   FROM user,chat
                   LEFT JOIN chat AS sent  ON user.id_user = sent.id_from
                   LEFT JOIN chat AS received ON user.id_user = received.id_to
                   LEFT JOIN chat AS noread ON noread.date_read=0 and user.id_user=noread.id_to
                   WHERE user.dateact <>0   GROUP BY user.id_user
После WHERE user.dateact <>0 добавил сортировку по дате последнего сообщения ORDER BY chat.date_writ DESC но почем то сортировка происходит не правильно что не так ?
 

Wicked

Новичок
как ты заключил, что сортировка происходит неправильно?
 

php5

Новичок
Из того что на первом месте не стоит пользователь с последним сообщением
 

Wicked

Новичок
1) кстати, ты ведь не order by пишешь до group by ?
2) выведи столбец chat.date_writ где ты там выводишь свои результаты. И убедись, что он идет отсортированным как надо. Надеюсь, это натолкнет тебя на мысли.
 
Сверху