Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

выборка кол-во сообщений пользователей

325
22 сентября 2009 года
Franky
723 / / 10.08.2005
всем привет!
Признаюсь честно, в MySQL не силен, но надо решить такую вот задачу.
Есть таблица комментариев comment вида:
data, text, autor
надо выбрать по убыванию кол-во сообщений пользователей, т.е. составить подобие рейтинга.
Да, autor - int, привязано к таблице пользователей, т.е. это id юзера.
В идеале хотелось бы сразу выбрать и имя пользователя (name) из таблицы пользователей (users)

Код:
`users` (
  `id` int DEFAULT NULL,
  `name` varchar(20) NOT NULL,
  `data` datetime DEFAULT NULL,
  UNIQUE KEY `name` (`name`),
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


`comment` (
  `id` bigint DEFAULT NULL,
  `autor` int,
  `text` mediumtext,
  `data` datetime NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


заранее спасибо!
385
22 сентября 2009 года
SomewherSomehow
477 / / 25.07.2004
 
Код:
select
    u.Name,
    count(*) as MsgCount
from
    comment c
    join users u on c.autor=u.id
group by
    u.Name
order by
    MsgCount
49K
22 сентября 2009 года
suff84
8 / / 08.06.2009
Цитата: SomewherSomehow
 
Код:
select
    u.Name,
    count(*) as MsgCount
from
    comment c
    join users u on c.autor=u.id
group by
    u.Name
order by
    MsgCount



В конце добавьте DESC, чтоб по убыванию было...

325
22 сентября 2009 года
Franky
723 / / 10.08.2005
спасибо огромное! Попробую разобраться и изучить этот момент :)
325
23 сентября 2009 года
Franky
723 / / 10.08.2005
всё поставил, запрос работает на ура, но не могли бы вы его подробно разжевать? Из мануалов я так и не смог понять что есть ху :(
12K
25 сентября 2009 года
Ghox
297 / / 26.07.2009
Попытаюсь я разжевать, надеюсь, смогу адекватно передать словами свое понимание того, что делается в запросе.

"Плясать" здесь нужно от
 
Код:
from
    comment c
    join users u on c.autor=u.id

Здесь делается соединение (join) таблиц comment и users - для каждой пары записей из comment и users, для которых выполняется условие c.autor=u.id, соединение выдает результирующую запись, содержащую связанные (условием соединения) запись из comment и запись из users. Для интереса можете попробовать выполнить запрос (правда не знаю будет ли он работать в MySQL, т.к. я работал только с Oracle):
 
Код:
select  *
from
    comment c
    join users u on c.autor=u.id


Далее нужно смотреть блоки select и group by:
 
Код:
select
    u.Name,
    count(*) as MsgCount
from
    ...
group by
    u.Name

group by u.Name означает, что получаемые с помощью join записи группируются по полю u.Name, т.е. для каждого комплекта записей, имеющих одно и то же значение u.Name, запрос в итоге выведет одну запись. В которой, согласно списку выводимых полей (заданному после "select "), отобразит значение u.Name, и в count(*) as MsgCount - количество записей в исходном (который был бы без группировки) результате запроса, имеющих это значение поля u.Name.

Ну и в конце
 
Код:
order by
    MsgCount desc

здесь уже совсем просто - задается сортировка по полю MsgCount при выводе результата запроса.

Чтобы все понять в этом запросе, вам нужно взять какой-нибудь учебник по SQL и прочитать:
- про соединения (join)
- про использование групповых функций (count, min, max и т.д.) вместе с группировкой по каким-либо полям, задаваемой операцией GROUP BY
- ну и (если еще не знаете) про сортировку результатов вывода запроса по ORDER BY
325
25 сентября 2009 года
Franky
723 / / 10.08.2005
спасибо огромное!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог