Сложный запрос - MySQL (219959)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Подскажите куда копать... очень сложно сходу в такое вникнуть, а надо.
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;
Нужно собрать статистику завершения квестов за период 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 Я остановился на этом этапе...
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
дошел до этого этапа: 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 из первого столбца.. как быть ??
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» по следующим критериям:

  1. Дата выполнения задания (DATE) должна быть больше '2016-02-08' и меньше '2016-02-14'.
  2. Задание должно быть выполнено (STATUS = 'COMPLETED').
  3. Результат выборки должен содержать: — quest_id (ID задания). — lvl (Уровень задания, полученный путем вычисления: level — MOD(level, 10), с добавлением символа '-', и последующим преобразованием в строку (CAST в CHAR(25)). — Количество выполненных заданий (COUNT(STATUS)).
  4. Сгруппировать результаты по ID задания (quest_id) и уровню (lvl).
  5. Отсортировать результаты по ID задания (quest_id) и уровню (lvl).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5