`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;
выборка кол-во сообщений пользователей
Признаюсь честно, в MySQL не силен, но надо решить такую вот задачу.
Есть таблица комментариев comment вида:
data, text, autor
надо выбрать по убыванию кол-во сообщений пользователей, т.е. составить подобие рейтинга.
Да, autor - int, привязано к таблице пользователей, т.е. это id юзера.
В идеале хотелось бы сразу выбрать и имя пользователя (name) из таблицы пользователей (users)
Код:
заранее спасибо!
Код:
select
u.Name,
count(*) as MsgCount
from
comment c
join users u on c.autor=u.id
group by
u.Name
order by
MsgCount
u.Name,
count(*) as MsgCount
from
comment c
join users u on c.autor=u.id
group by
u.Name
order by
MsgCount
Цитата: 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
u.Name,
count(*) as MsgCount
from
comment c
join users u on c.autor=u.id
group by
u.Name
order by
MsgCount
В конце добавьте DESC, чтоб по убыванию было...
спасибо огромное! Попробую разобраться и изучить этот момент :)
всё поставил, запрос работает на ура, но не могли бы вы его подробно разжевать? Из мануалов я так и не смог понять что есть ху :(
"Плясать" здесь нужно от
Код:
from
comment c
join users u on c.autor=u.id
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
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
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 desc
здесь уже совсем просто - задается сортировка по полю MsgCount при выводе результата запроса.
Чтобы все понять в этом запросе, вам нужно взять какой-нибудь учебник по SQL и прочитать:
- про соединения (join)
- про использование групповых функций (count, min, max и т.д.) вместе с группировкой по каким-либо полям, задаваемой операцией GROUP BY
- ну и (если еще не знаете) про сортировку результатов вывода запроса по ORDER BY
спасибо огромное!