Задавайте вопросы, мы ответим
Вы не зашли.
Всем привет... Нужна помощь в корректировке запроса.
Есть задача:
В таблице products находятся товары, а в categories — категории, к которым они относятся. Поле category_id является внешним ключом, который указывает на первичный ключ категории.
Получите в одном запросе имя товара, цену товара и имя категории, к которой принадлежит товар.
Отсортируйте данные в алфавитном порядке по имени товара.
Имя категории выведите в колонке с именем category.
Если у товара нет категории, то выведите NULL.
products
id name count price category_id
1 Сникерс большой 3 56 1
2 Сливочное масло Милка 2 104.4 2
3 Яблоки ред 7 98 NULL
4 Яблоки голден 3 89 NULL
5 Марс 7 36.5 1
6 Сметана 20 2 49 2
7 Сметана 15 4 45 2
8 Сметана 20 фермерская 1 78.9 2
9 Апельсины 5 70 NULL
10 Макароны 1 кг 4 56 4
11 Вода 1 л 12 18 5
12 Гречка 0,5 кг 4 45 4
13 Хлеб былый 7 23.4 8
14 Творог 9 3 56 2
15 Шампунь H&S 0 238 7
16 Баунти 0 38.9 1
17 Батон купеческий 5 34.5 8
18 Говядина 1 308 17
19 Помидоры 8 46 NULL
20 Индейка 2 534 17
21 Свинина 0 349 17
22 Тарелки 12 шт 0 780 6
23 Кружки 6 шт 0 230 6
categories
id name
1 Шоколад
2 Молочные продкты
3 Фрукты и овощи
4 Крупы
5 Напитки
6 Посуда
7 Шампуни
8 Хлеб
9 Консервы
10 Чай и кофе
11 Алкоголь
12 Колбасы
13 Полуфабрикаты
14 Растительное масло
15 Рыба
16 Товары гигиены
17 Мясо
Вот решение которое до которого я додумался:
SELECT p.name,
p.price,c.name as category
FROM products as p
JOIN categories as c
ON c.id = p.category_id
ORDER BY name
Возврат по нему такой:
The query should return 23 records
Query result:
+-----------------------+-------+------------------+
| name | price | category |
+-----------------------+-------+------------------+
| Батон купеческий | 35 | Хлеб |
| Баунти | 39 | Шоколад |
| Вода 1 л | 18 | Напитки |
| Говядина | 308 | Мясо |
| Гречка 0,5 кг | 45 | Крупы |
| Индейка | 534 | Мясо |
| Кружки 6 шт | 230 | Посуда |
| Макароны 1 кг | 56 | Крупы |
| Марс | 37 | Шоколад |
| Свинина | 349 | Мясо |
| Сливочное масло Милка | 104 | Молочные продкты |
| Сметана 15 | 45 | Молочные продкты |
| Сметана 20 | 49 | Молочные продкты |
| Сметана 20 фермерская | 79 | Молочные продкты |
| Сникерс большой | 56 | Шоколад |
| Тарелки 12 шт | 780 | Посуда |
| Творог 9 | 56 | Молочные продкты |
| Хлеб былый | 23 | Хлеб |
| Шампунь H&S | 238 | Шампуни |
+-----------------------+-------+------------------+
Affected rows: 19
Что нужно добавить/исправить?
Помогите "допинать" его до правильного решения :-)
Неактивен
При Вашем текущем варианте запроса не будут выведены товары, у которых category_id NULL. поменяйте JOIN на LEFT JOIN, должно получиться веселее - всякие безкатегорийные помидоры появятся
Неактивен
deadka написал:
При Вашем текущем варианте запроса не будут выведены товары, у которых category_id NULL. поменяйте JOIN на LEFT JOIN, должно получиться веселее - всякие безкатегорийные помидоры появятся
Я уже веселился так
Я вот и хочу помощи как сделать чтоб не веселиться от возвращенного результата, а радоваться решению задачи и очередному баллу
Неактивен
deadka написал:
При Вашем текущем варианте запроса не будут выведены товары, у которых category_id NULL. поменяйте JOIN на LEFT JOIN, должно получиться веселее - всякие безкатегорийные помидоры появятся
ОГО
Самое интересное что я поменял на LEFT JOIN (до этого пробовал LEFT OUTER JOIN) и задача решилась
Query result:
+-----------------------+-------+------------------+
| name | price | category |
+-----------------------+-------+------------------+
| Апельсины | 70 | None |
| Батон купеческий | 35 | Хлеб |
| Баунти | 39 | Шоколад |
| Вода 1 л | 18 | Напитки |
| Говядина | 308 | Мясо |
| Гречка 0,5 кг | 45 | Крупы |
| Индейка | 534 | Мясо |
| Кружки 6 шт | 230 | Посуда |
| Макароны 1 кг | 56 | Крупы |
| Марс | 37 | Шоколад |
| Помидоры | 46 | None |
| Свинина | 349 | Мясо |
| Сливочное масло Милка | 104 | Молочные продкты |
| Сметана 15 | 45 | Молочные продкты |
| Сметана 20 | 49 | Молочные продкты |
| Сметана 20 фермерская | 79 | Молочные продкты |
| Сникерс большой | 56 | Шоколад |
| Тарелки 12 шт | 780 | Посуда |
| Творог 9 | 56 | Молочные продкты |
| Хлеб былый | 23 | Хлеб |
| Шампунь H&S | 238 | Шампуни |
| Яблоки голден | 89 | None |
| Яблоки ред | 98 | None |
+-----------------------+-------+------------------+
Affected rows: 23
Видимо система не очень сильно придирается к значениям возвращенной таблицы... Но это же не совсем правильно?
Неактивен
Странно, по идее LEFT JOIN и LEFT OUTER JOIN должны давать один результат. Если у Вас они разные результаты дают - приложите оба результата сюда в топик?
Lugner32 написал:
Видимо система не очень сильно придирается к значениям возвращенной таблицы... Но это же не совсем правильно?
Не вполне понятен вопрос, если честно.
Неактивен
deadka написал:
Странно, по идее LEFT JOIN и LEFT OUTER JOIN должны давать один результат. Если у Вас они разные результаты дают - приложите оба результата сюда в топик?
Прошу прощения я Вас дезинформировал я "игрался" с RIGHT JOINомLugner32 написал:
Видимо система не очень сильно придирается к значениям возвращенной таблицы... Но это же не совсем правильно?
Не вполне понятен вопрос, если честно.
Я имел ввиду что по условиям задачи безкатегорийные товары должны в поле category возвращать NULL а не None
Однако с None ответ на задачу прошёл и был засчитан...
Хочется понять как должно быть,чтобы был NULL..
Подскажите?
Отредактированно Lugner32 (16.04.2019 11:30:37)
Неактивен
А где Вы запросы-то запускаете? None - это Ваш mysql-клиент уже "своевольничает", там должен быть NULL. попробуйте в родном mysql-клиенте?
Неактивен
deadka написал:
А где Вы запросы-то запускаете? None - это Ваш mysql-клиент уже "своевольничает", там должен быть NULL. попробуйте в родном mysql-клиенте?
Это задачи на учебном сервисе( степик.орг)... есть задача и окно для ответа и неограниченное число попыток
Неактивен
Однако с None ответ на задачу прошёл и был засчитан...
Ну вот это, значит степик.орг'овские какие-то уже фокусы, хорошо, что преподаватели это понимают ))
Неактивен
deadka написал:
Однако с None ответ на задачу прошёл и был засчитан...
Ну вот это, значит степик.орг'овские какие-то уже фокусы, хорошо, что преподаватели это понимают ))
Это точно!
Но всё же, что мне нужно было дописать для того чтобы NULL был? Просто Стэпик стэпиком, а правильность понять хочется..Ибо в дальнейшем если жизнь меня свяжет с работой с СУБД то нужно же грамотно составлять запросы )))
Неактивен
Ничего не нужно, и так будет NULL, если в нормальном клиенте запускать.
Можете убедиться на каком-нибудь https://www.db-fiddle.com/
Неактивен
deadka написал:
Ничего не нужно, и так будет NULL, если в нормальном клиенте запускать.
Можете убедиться на каком-нибудь https://www.db-fiddle.com/
Спасибо за помощь :-) В общем буду тренироваться))) У меня установлен HeidiSQL..Буду там создавать таблицы и тестить запросы :-)
Неактивен
Удачи в тернистом, но отрадном пути database-developer'a :-)
Неактивен
deadka написал:
Удачи в тернистом, но отрадном пути database-developer'a :-)
THANK YOU VERY MUCH!! И Вам удачи во всех делах :-)
Неактивен