Сложный запрос - MySQL (219959)
Формулировка задачи:
Доброго времени суток! Подскажите куда копать... очень сложно сходу в такое вникнуть, а надо.
Нужно собрать статистику завершения квестов за период 2016/02/08 - 2016/02/14:
1. выбрать квесты со статусом 'COMPLETED' в каждой группе,
2. сгруппировать квесты по их ID и диапазону уровней (1-10, 10-20, 20-30 и т.д.),
3. посчитать количество квестов в каждой группе.
Пример полученной выборки:
1021 10-20 4
1021 20-30 64
1021 30-40 76
1021 40-50 29
1022 10-20 1
1022 20-30 34
1022 30-40 58
1022 40-50 14
1023 10-20 3
1023 20-30 18
1023 30-40 60
1023 40-50 72
1023 50-60 2
Я остановился на этом этапе...
что делать дальше не представляю.
дошел до этого этапа:
2022 0-10 37
3021 30-40 28
5021 10-20 23
6021 20-30 34
9025 40-50 29
9026 80-90 4
9026 60-70 3
9026 50-60 10
вот только третий столбик подсчитывает совпадения только для диапазонов игнорируя при этом уникальность quest_id из первого столбца.. как быть ??
как оказалось все было правильно, вот только кавычки вокруг
были неправильные
В чем отличие кавычки ' от ` - на результат влияют кардинально?
CREATE TABLE `quests` ( `uid` INT(10) UNSIGNED NOT NULL, `snid` SMALLINT(5) UNSIGNED NOT NULL, `level` SMALLINT(5) UNSIGNED NOT NULL, `date` TIMESTAMP NOT NULL, `quest_id` INT(10) UNSIGNED NOT NULL, `status` ENUM('ACCEPTED','COMPLETED') NOT NULL, INDEX `fk_uid` (`uid` ASC), INDEX `dt_date` (`date` ASC)) ENGINE = MyISAM;
SELECT quest_id, level FROM quests WHERE DATE > '2016-02-08' AND DATE < '2016-02-14' AND STATUS = 'COMPLETED' GROUP BY `quest_id` ORDER BY quest_id
SELECT quest_id , concat(CAST((level - MOD(level, 10)) AS CHAR(25)),'-',CAST((level - MOD(level, 10)+10) AS CHAR(25))) AS lvl , COUNT(STATUS) FROM quests WHERE DATE > '2016-02-08 17:04:55' AND DATE < '2016-02-08 18:05:55' AND STATUS = 'COMPLETED' GROUP BY 'quest_id', `lvl` ORDER BY quest_id
SELECT quest_id , concat(CAST((level - MOD(level, 10)) AS CHAR(25)),'-',CAST((level - MOD(level, 10)+10) AS CHAR(25))) AS lvl , COUNT(STATUS) AS statCount FROM quests WHERE DATE > '2016-02-08' AND DATE < '2016-02-14' AND STATUS = 'COMPLETED' GROUP BY `quest_id`, `lvl` ORDER BY quest_id, lvl
GROUP BY `quest_id`
GROUP BY 'quest_id'
Решение задачи: «Сложный запрос»
textual
Листинг программы
SELECT quest_id, concat(CAST((level - MOD(level, 10)) AS CHAR(25)),'-',CAST((level - MOD(level, 10)+10) AS CHAR(25))) AS lvl, COUNT(STATUS) FROM quests WHERE DATE > '2016-02-08' AND DATE < '2016-02-14' AND STATUS = 'COMPLETED' GROUP BY `quest_id`, `lvl` ORDER BY quest_id, lvl"
Объяснение кода листинга программы
В представленном коде идёт выборка данных из таблицы «quests» по следующим критериям:
- Дата выполнения задания (DATE) должна быть больше '2016-02-08' и меньше '2016-02-14'.
- Задание должно быть выполнено (STATUS = 'COMPLETED').
- Результат выборки должен содержать: — quest_id (ID задания). — lvl (Уровень задания, полученный путем вычисления: level — MOD(level, 10), с добавлением символа '-', и последующим преобразованием в строку (CAST в CHAR(25)). — Количество выполненных заданий (COUNT(STATUS)).
- Сгруппировать результаты по ID задания (quest_id) и уровню (lvl).
- Отсортировать результаты по ID задания (quest_id) и уровню (lvl).
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д