EgoRusMarch
@EgoRusMarch
C++ Developer

MySQL. Возможно ли заменить UNION или как оптимизировать запрос?

Есть вот такая БД под названием computer_company
5fe1569404134ab5847b7d2ac3ffc9e6.pngЗадание:
Найдите номер модели продукта (ПК, ноутбука или принтера), имеющего самую высокую цену.

Вот, что я написал:
(SELECT model, price FROM pc)
UNION
(SELECT model, price FROM laptop)
UNION
(SELECT model, price FROM printer)
ORDER BY price DESC LIMIT 1;

Запрос получился довольно карявый, есть ли более рациональный способ? Необходим ли здесь UNION?
  • Вопрос задан
  • 1358 просмотров
Решения вопроса 1
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Union можно оставить, но добавить в каждый из подзапросов лимит и сортировку - зачем вам собирать полностью три таблицы, а потом выкидывать всё, кроме первой строки?

А вообще, такая структура БД - антипаттерн. Цена есть у всех продуктов, вне зависимости от типа, поэтому эта колонка должна быть в основной таблице. Не в последнюю очередь для того, чтобы избежать таких кривых выборок.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
shogunkub
@shogunkub
Программист+Инженер-электронщик
Вообще, есть же агрегатная функция MAX, но поскольку её надо применять несколько раз, и нужен сам предмет, а не только цена - вряд ли будет лучше. А именно в этом запросе, действительно, LIMIT с сортировкой в подзапросах просится, т.к. иначе получается, что строится одна огромная таблица, а потом из неё получается одна строка.
Есть ещё подвох - что надо делать при одинаковой максимальной цене у нескольких предметов? :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы