Задавайте вопросы, мы ответим
Вы не зашли.
Приветствую, помогите, пожалуйста, вот с таким вот запросом.
Есть база данных, которая состоит из двух таблиц, студентов и курсов.
Необходимо построить запрос, который будет вычислять курсы, на которых учится больше студентов, чем на первом курсе.
Что-то никак не могу допереть как его построить.
Дамп базы:
--
-- Структура таблицы `kurses`
--
CREATE TABLE IF NOT EXISTS `kurses` (
`id` int(7) NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE cp1251_general_cs NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs AUTO_INCREMENT=6 ;
--
-- Дамп данных таблицы `kurses`
--
INSERT INTO `kurses` (`id`, `title`) VALUES
(1, 'Первый курс'),
(2, 'Второй курс'),
(3, 'Третий курс'),
(4, 'Четвертый курс'),
(5, 'Пятый курс');
-- --------------------------------------------------------
--
-- Структура таблицы `students`
--
CREATE TABLE IF NOT EXISTS `students` (
`id` int(7) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE cp1251_general_cs NOT NULL,
`surname` varchar(255) COLLATE cp1251_general_cs NOT NULL,
`patr` varchar(255) COLLATE cp1251_general_cs NOT NULL,
`kurs` int(7) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_general_cs AUTO_INCREMENT=22 ;
--
-- Дамп данных таблицы `students`
--
INSERT INTO `students` (`id`, `name`, `surname`, `patr`, `kurs`) VALUES
(1, 'Вася', 'Пупкин', 'Пупкинович', 1),
(2, 'Петя', 'Баранов', 'Суперович', 1),
(3, 'ваыпыв', 'ывапывап', 'апывапыв', 1),
(4, 'ывпвы', 'пывп', 'пвап', 1),
(5, 'Василий ', 'іваі', 'аіваі', 2),
(6, 'віаів', 'аів', 'аіва', 2),
(7, 'іва', 'іва', 'іваів', 2),
(8, 'віаіва', 'аіва', 'іваів', 2),
(9, 'іваів', 'аіва', 'іваів', 2),
(10, 'віаіва', 'аіва', 'іваів', 2),
(11, 'іваів', 'іва', 'аіва', 3),
(12, 'іва', 'аіва', 'ів', 3),
(13, 'ів', 'аіваі', 'ваів', 3),
(14, 'ваі', 'аі', 'віаів', 4),
(15, 'іваів', 'аів', 'аі', 4),
(16, 'іваів', 'аів', 'аіва', 4),
(17, 'іваіва', 'іва', 'іва', 4),
(18, 'іва', 'іваі', 'ваів', 4),
(19, 'іваіва', 'іва', 'іва', 4),
(20, 'ів', 'аів', 'аіва', 5),
(21, 'іва', 'іваів', 'аіва', 5);
Неактивен
Как то так:
SELECT k.title, count(s.kurs) as cnt
FROM kurses as k
LEFT JOIN students as s ON k.id = s.kurs
GROUP BY k.id
HAVING cnt > (SELECT count(s.kurs) FROM students as s WHERE s.kurs=1 GROUP BY s.kurs);
Неактивен
Спасибо огромное, работает! Не могли бы вы расписать подробнее комментарии к каждый строчке, что мы мне было понятнее понять это все дело?
Неактивен
ehotron написал:
Спасибо огромное, работает! Не могли бы вы расписать подробнее комментарии к каждый строчке, что мы мне было понятнее понять это все дело?
Давай ты скажешь, что в запросе не понятно, а я отвечу.
Неактивен
Не могу понять, зачем GROUP BY k.id
Неактивен
ehotron написал:
Не могу понять, зачем GROUP BY k.id
Указываю по какому полю сгруппировать записи и считать их количество.
Для наглядности выполни запросы:
SELECT k.title, s.*
FROM kurses as k
LEFT JOIN students as s ON k.id = s.kurs
Получишь список курсов и студентов одной таблицей.
Если сделаешь так
SELECT k.title, count(s.kurs)
FROM kurses as k
LEFT JOIN students as s ON k.id = s.kurs
Считает все строки без разбора.
А указав по какому полю объединить строки - MySQL сделает то, что тебе надо.
Неактивен
Супер! Спасибо большое!
Неактивен