MariaDB/MySQL: улучшение SQL-запроса

240
26 ноября 2016, 20:18

В оптимизации одного из подзапросов я дошел до такого состояния:

    SELECT foo.id
      FROM foo
INNER JOIN bar AS f ON foo.id = bar.foo_id
  GROUP BY foo.id
    HAVING MAX(foo.baz) != MAX(bar.baz)

Важно здесь следующее:

  • используется MariaDB
  • таблицы foo и bar связаны отношением один-ко-многим
  • подзапросы запрещены
  • возвращается одно поле - foo.id

Не нравится хак с агрегатной функцией в HAVING — если применительно к полю bar.baz оно имеет смысл (выбираем только те записи, для которых поле foo.baz не равно максимальному bar.baz), то в случае с полем foo.baz оно используется исключительно для того, чтобы убрать поле из блока SELECT. Плюс, есть риск того, что max(*) возвращает не ожидаемый результат.

Как улучшить запрос?

Answer 1

Мне казалось что бизнесу главное что бы было правильно и быстро. Можно попробовать такой вариант с временной таблицей, должно быть быстрее.

select bar.foo_id, MAX(bar.baz) baz
into #bar
from bar
group by bar.foo_id
create index ix on #bar (foo_id, baz)
select foo.id
from foo
join #bar bar on foo.id = bar.foo_id AND foo.baz <> bar.baz
READ ALSO
Выполнение транзакций MySQL

Выполнение транзакций MySQL

Почему при выполнении транзакции с запросом с ошибкой коммит всё равно срабатывает для запросов, выполненных успешно? Например, при попытке...

263
работа с двумя таблицами mysql

работа с двумя таблицами mysql

Есть две таблицы:

310
Как реализовать вывод данных из MySQL

Как реализовать вывод данных из MySQL

!!!РЕШЕНО Дано: таблица mysql и три поля

294
Получение данных из внешней базы в Rails

Получение данных из внешней базы в Rails

Мне необходимо получить/обновить/удалить данные во внешней базе, никак не относящийся к базе самого приложенияНеобходимо к ней обращаться...

247