Xpoint
   [напомнить пароль]

Получить количество пользователей живущих в городе(SQL)

Метки: [без меток]
2010-04-30 14:35:51 [обр] Max[досье]

Здравствуйте, задача не сложная но хочется найти оптимальное решение.
Вот структура
Упрощённая структура:

user:
id_user
name
id_city

city:
id_city
city_name

Естественно city.id_city -> user.id_city связь один ко многим

Вопрос:
Как максимально просто узнать количество пользователей(user) проживающих в городеах(city) и при этом выбрать первые 10 городов с максимальным населением?
Спасибо за ответ!

спустя 29 минут [обр] Thirteensmay(0/157)[досье]
select city_id,
       count(*) as kolvo
from t_user
group by city_id
order by kolvo desc
как выбрать первые 10 строк зависит от СУБД
спустя 5 минут [обр] Max[досье]
Спасибо за ответ, но в том то и дело что мне нужно именно первые 10 городов отсортированные по населению, то есть выбрать 10 самых густонаселенных городов в одном запросе. СУБД Mysql.
спустя 6 минут [обр] Max[досье]
Спасибо, Thirteensmay, не догадался сразу до такого простого решения, все усложнял.
спустя 4 минуты [обр] Thirteensmay(0/157)[досье]
к представленному выше запросу в конце попробуйте приписать limit 10 http://dev.mysql.com/doc/refman/5.0/en/select.html
спустя 10 минут [обр] Max[досье]
сообщение промодерировано

Можно еще вопрос, GROUP BY можно использовать с JOIN и если да то что я не правильно делаю тут:

SELECT user.id_school, count(*) as count_s  
FROM user GROUP BY user.id_school
INNER JOIN school ON school.id_school = user.id_school 
INNER JOIN city ON city.id_city = school.id_city  
ORDER BY count_s DESC

Когда убираешь GROUP BY user.id_school всё работает.

Структура

--
-- Структура таблицы `city`
--

CREATE TABLE IF NOT EXISTS `city` (
  `id_city` int(11) NOT NULL auto_increment,
  `id_country` int(11) NOT NULL,
  `head` text NOT NULL,
  PRIMARY KEY  (`id_city`)
)

--
-- Структура таблицы `school`
--

CREATE TABLE IF NOT EXISTS `school` (
  `id_school` int(11) NOT NULL auto_increment,
  `id_city` int(11) NOT NULL,
  `head` text NOT NULL,
  PRIMARY KEY  (`id_school`),
  KEY `id_city` (`id_city`)
)

--
-- Дамп данных таблицы `school`
--

-- --------------------------------------------------------

--
-- Структура таблицы `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id_user` int(11) NOT NULL auto_increment,
  `id_city` int(11) NOT NULL,
  `id_school` int(11) NOT NULL,

  PRIMARY KEY  (`id_user`),
  KEY `id_city` (`id_city`),
  KEY `id_school` (`id_school`),
)
спустя 2 минуты [обр] Max[досье]
Это упрощенная структура, но все основные поля сохранены, мне нужно выбрать что то в виде
id_school, count_school, school_head, city_head
спустя 22 секунды [обр] Max[досье]
Если можно подскажите как.
спустя 1 час 7 минут [обр] Алексей Севрюков(7/1292)[досье]
Max[досье] RTFM, GROUP BY идет перед ORDER и после WHERE (если условия отсутствуют то после FROM. Т.е.:
SELECT user.id_school, count(*) as count_s  
FROM user 
INNER JOIN school ON school.id_school = user.id_school 
INNER JOIN city ON city.id_city = school.id_city  
GROUP BY user.id_school
ORDER BY count_s DESC
спустя 10 минут [обр] Thirteensmay(0/157)[досье]

для MySQL прям так сразу красиво не напишу, не работаю с ней, по видимости фунциклировать будет:

select u.school_id,
       count (*) as school_count,
       (select head from t_school
        where school_id = u.school_id) as school_head,
       (select head from t_city
        where city_id = (select city_id from t_school
                         where school_id = u.school_id)) as city_head
from t_user u
group by u.school_id

но это как минимум не хорошо с точки зрения производительности, по хорошему надо одним подзапросом дернуть связку школ с хедами а потом уже в подзапросах "as school_head" и "as city_head" легко выбирать из этого подзапроса, но как такое сделать в MySQL с ходу не скажу.

Powered by POEM™ Engine Copyright © 2002-2005