Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите создать запрос / 13 сообщений из 13, страница 1 из 1
05.02.2006, 14:14
    #33524192
nik:-)
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
Доброго времени суток.

Возникла следующая проблема: есть 2 таблицы users и messages, и необходимо вычислить сколько сообщений записано для каждого пользователя.

Структура таблиц:

users(id int, login varchar)
messages(id int, userid int, message varchar)

Соответсвенно в поле userid таблицы messages записывается id соответсвующей строки в таблице users.

Формирую следующий запрос:

select u.login,count(m.id)
from users u, messages m
where u.id=m.userid

Всё замечательно работает до момента, пока для пользователя есть сообщения, а вот когда их нет, то неплохо бы вывести "0", но в выводе вообще отсутствует строка с пользователем, для которого нет сообщений.

Пожалуйста, помогите решить проблему. Заранее благодарен.
...
Рейтинг: 0 / 0
05.02.2006, 14:28
    #33524200
vooo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
Неплохо было бы поместить данное сообщение в ветку по соответствующей СУБД
...
Рейтинг: 0 / 0
05.02.2006, 14:29
    #33524201
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
nik:-)select u.login,count(m.id)
from users u, messages m
where u.id=m.useridСУБД какая?

для Оракла я бы написал так:
Код: plaintext
1.
2.
select u.login, nvl(cnt, 0 ) cnt
from users u, (SELECT id, count(*) cnt FROM messages GROUP BY id) m
where u.id=m.userid(+)
для других СУБД (+) надо заменить на какой-нибудь LEFT JOIN...
а GROUP BY нужна для всех СУБД.
...
Рейтинг: 0 / 0
05.02.2006, 14:29
    #33524202
VirusXP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
Код: plaintext
1.
2.
3.
4.
select u.login,
         count(isnull(m.id,  0 ))
from users u
left join messages m on m.userid = u.id
это раздел - MSSQL
...
Рейтинг: 0 / 0
05.02.2006, 14:30
    #33524203
VirusXP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
сорри, group by забыл впаять
...
Рейтинг: 0 / 0
05.02.2006, 14:33
    #33524205
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
VirusXP
Код: plaintext
1.
         count(isnull(m.id,  0 ))

здесь точно нужен isnull?
я не знаю MSSQL, но могу предположить, что для пользователей у которых нет сообщений этот запрос ошибочно выдаст 1.
...
Рейтинг: 0 / 0
05.02.2006, 14:35
    #33524207
VirusXP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select u.login,
         sum(case when m.id is null then  0 
                       else  1 
               end)
from users u
left join messages m on m.userid = u.id
group by u.login
...
Рейтинг: 0 / 0
05.02.2006, 14:37
    #33524209
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
VirusXP
Код: plaintext
1.
2.
3.
         sum(case when m.id is null then  0 
                       else  1 
               end)

а разве
Код: plaintext
count(m.id)
не даст тоже самое?
...
Рейтинг: 0 / 0
05.02.2006, 14:40
    #33524213
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
VirusXP
Код: plaintext
1.
group by u.login

в исходных условиях нет гарантии, что логины не дублируются.
имхо, правильнее группировать по id
...
Рейтинг: 0 / 0
05.02.2006, 14:41
    #33524215
VirusXP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
я чесно говоря вообще не понимаю причем здесь messages.id ведь соединение таблиц идёт по messages.userid
...
Рейтинг: 0 / 0
05.02.2006, 14:42
    #33524216
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
VirusXPя чесно говоря вообще не понимаю причем здесь messages.id ведь соединение таблиц идёт по messages.userid
я про user.id
...
Рейтинг: 0 / 0
05.02.2006, 14:44
    #33524217
VirusXP
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
miksoftя про user.id
согласен. вот что значит пиво хреново влияет
...
Рейтинг: 0 / 0
06.02.2006, 06:31
    #33524734
nik:-)
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите создать запрос
Большое спасибо, Вы все мне очень помогли.
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Помогите создать запрос / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]