SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 06.05.2019 10:39:14

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Помогите найти и исправить ошибку в решении задачи

Всем привет! И снова задачка:
На главной странице сайта выводится ТОП5 компьютерных игр. Чтобы вывод был разнообразным — берут по две самых популярных игры из 5 категорий, а затем сортируют полученные данные по рейтингу в прямом порядке. Строки с одинаковым рейтингом отсортируйте по id.

Получите из таблицы games данные для вывода на главную страницу сайта для категорий: 1 - Action, 2 - RPG, 3 - Adventure, 4 - Strategy и 5 - Shooter. Выведите поля id, name, rating и genre, где genre — название категории.

games
id    category_id    name    rating    year
1    2    The Witcher 3: Wild Hunt    9.61    2015
2    4    Warcraft III: The Frozen Throne    9.00    2003
3    1    Max Payne 2: The Fall of Max Payne    8.63    2003
4    3    The Last of Us    9.45    2013
5    3    Mafia II    8.94    2010
6    1    Grand Theft Auto V    9.18    2013
7    5    Far Cry 3    8.67    2012
8    4    Plants vs. Zombies    8.90    2009
9    2    Diablo III    9.22    2012
10    8    Mortal Kombat X    8.70    2015
11    7    Tetris    9.05    1984
12    5    Doom    8.75    2016
13    2    Mass Effect 3    9.00    2012
14    3    Uncharted 4: A Thief's End    9.33    2016
15    2    Call of Duty: Black Ops II    8.88    2012
16    5    Metro: Last Light    9.25    2013
17    1    Outlast    9.00    2013
18    6    Need for Speed: Most Wanted    9.08    2005
19    4    Warcraft III: Reign of Chaos    9.29    2002
20    3    The Walking Dead: The Game - Season 2    9.00    2014

Пропробовал так:

SELECT   id, name, rating, genre FROM
(SELECT
    id,
    name,
    rating,
    'Action' as genre
FROM
    games
WHERE category_id = 1
ORDER BY rating DESC LIMIT 2) as genre
UNION
(SELECT
    id,
    name,
    rating,
    'RPG' as genre
FROM
    games
WHERE category_id = 2
ORDER BY rating DESC LIMIT 2)
UNION
(SELECT
    id,
    name,
    rating,
    'Adventure' as genre
FROM
    games
WHERE category_id = 3
ORDER BY rating DESC LIMIT 2)
UNION
(SELECT
    id,
    name,
    rating,
    'Strategy' as genre
FROM
    games
WHERE category_id = 4
ORDER BY rating DESC LIMIT 2)
UNION
(SELECT
    id,
    name,
    rating,
    'Shooter' as genre
FROM
    games
WHERE category_id = 5
ORDER BY rating DESC LIMIT 2)
ORDER BY rating , id LIMIT 5

Результат такой:Wrong records selected

Query result:
+----+---------------------------------+--------+----------+
| id | name                            | rating | genre    |
+----+---------------------------------+--------+----------+
| 12 | Doom                            | 8.75   | Shooter  |
| 2  | Warcraft III: The Frozen Throne | 9.00   | Strategy |
| 17 | Outlast                         | 9.00   | Action   |
| 6  | Grand Theft Auto V              | 9.18   | Action   |
| 9  | Diablo III                      | 9.22   | RPG      |
+----+---------------------------------+--------+----------+
Affected rows: 5

Помогите исправить smile

Заранее спасибо smile

Неактивен

 

#2 07.05.2019 13:02:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите найти и исправить ошибку в решении задачи

зачем limit 5 в конце?

Неактивен

 

#3 07.05.2019 13:42:43

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Re: Помогите найти и исправить ошибку в решении задачи

vasya написал:

зачем limit 5 в конце?

Так в условии же ТОП 5... Те. как я понял по 1 из каждой категории... если убрать то система ругается.. пишет что Запрос должен вернуть 5 записей

Неактивен

 

#4 07.05.2019 13:45:23

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Re: Помогите найти и исправить ошибку в решении задачи

Как видно из возвращенной таблицы у меня дубль категории 'ACTION'  как его убрать?  По идее должен быть 'Adventure' вместо одного из них

Неактивен

 

#5 07.05.2019 14:25:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Помогите найти и исправить ошибку в решении задачи

Lugner32 написал:

Как видно из возвращенной таблицы у меня дубль категории 'ACTION'  как его убрать?  По идее должен быть 'Adventure' вместо одного из них

из условия это не следует
имхо, ваш ответ соответствует условию задачи

если это тест, попробуйте методом тыка
возможно криво сформулировано и после окончательной сортировки нужно брать 5 последних (что ближе по смыслу к top 5), а не первых

Неактивен

 

#6 07.05.2019 15:01:35

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Re: Помогите найти и исправить ошибку в решении задачи

vasya написал:

Lugner32 написал:

Как видно из возвращенной таблицы у меня дубль категории 'ACTION'  как его убрать?  По идее должен быть 'Adventure' вместо одного из них

из условия это не следует
имхо, ваш ответ соответствует условию задачи

если это тест, попробуйте методом тыка
возможно криво сформулировано и после окончательной сортировки нужно брать 5 последних (что ближе по смыслу к top 5), а не первых

Это задача на онлайн курсе. Я скинул запрос преподу.. Посмотрим что он ответит..

Спасибо! smile

Неактивен

 

#7 07.05.2019 16:10:13

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Re: Помогите найти и исправить ошибку в решении задачи

Вот ответ преподавателя: в последней строке надо добавить DESC для рейтинга. А потом написать еще один финальный внешний запрос.
И тут я понял что нифига не понял

Неактивен

 

#8 07.05.2019 17:30:24

Lugner32
Завсегдатай
Зарегистрирован: 04.04.2019
Сообщений: 25

Re: Помогите найти и исправить ошибку в решении задачи

vasya написал:

из условия это не следует
имхо, ваш ответ соответствует условию задачи

если это тест, попробуйте методом тыка
возможно криво сформулировано и после окончательной сортировки нужно брать 5 последних (что ближе по смыслу к top 5), а не первых

SELECT id, name,rating , genre  FROM (SELECT id, name,rating , genre FROM
(SELECT id, name, rating, 'Action' as genre
FROM games WHERE category_id = 1
ORDER BY rating DESC LIMIT 2) as genre
UNION
(SELECT id, name,rating, 'RPG' as genre
FROM games WHERE category_id = 2
ORDER BY rating DESC LIMIT 2)
UNION
(SELECT id, name, rating, 'Adventure' as genre
FROM games
WHERE category_id = 3
ORDER BY rating DESC LIMIT 2)
UNION
(SELECT id, name,rating, 'Strategy' as genre
FROM games
WHERE category_id = 4
ORDER BY rating DESC LIMIT 2)
UNION
(SELECT id, name, rating, 'Shooter' as genre
FROM games
WHERE category_id = 5
ORDER BY rating DESC LIMIT 2)
ORDER BY rating desc, id LIMIT 5) as name
ORDER BY rating, id

В общем вот так получилось smile Действительно в результирующей таблице не должно было быть строго по одной категории..
Query result:
+----+------------------------------+--------+-----------+
| id | name                         | rating | genre     |
+----+------------------------------+--------+-----------+
| 16 | Metro: Last Light            | 9.25   | Shooter   |
| 19 | Warcraft III: Reign of Chaos | 9.29   | Strategy  |
| 14 | Uncharted 4: A Thief's End   | 9.33   | Adventure |
| 4  | The Last of Us               | 9.45   | Adventure |
| 1  | The Witcher 3: Wild Hunt     | 9.61   | RPG       |
+----+------------------------------+--------+-----------+
Affected rows: 5

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson