Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
Добрый день, уважаемые эксперты. Версия сервера MySQL: 5.7.21 Таблица: idсделанопереданообъект101400200400311400421400511500601500 Легенда: сделано: 0 - в процессе, 1 - сделано, 2 - отменено передано: 0 - не передано, 1 - передано (упрощено до 0,1, а так здесь стоят даты) Запрос: Код: sql 1. 2. 3. 4. Результат: idсделанопереданообъектзаданий60150022004004 В приоритете, чтобы GROUP BY отбирал результат по "передано"=0, а потому уже по "сделано"=0. Данный запрос работает корректно и со своей задачей справляется. Вопрос: Можно ли оптимизировать данный запрос, чтобы время выполнения было ещё меньше, например использовать min и JOIN, и исключить DISTINCT и ORDER BY? Если, да, то можно ли скелет запроса, остальное я додумаю сам. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 11:01 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. А в чем смысл подзапроса? id и так уникальный. А сортировка бессмысленна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 11:37 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. Результат должен быть тем же. только непонятно почему у тебя это работает без агрегирующих функций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 11:41 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
General4В приоритете, чтобы GROUP BY отбирал результат по "передано"=0, а потому уже по "сделано"=0. Я правильно понимаю: Над вывести записи ID с минимальным "сделано", если "сделано несколько", то выбрать с минимальным "передано" в разрезе "объект" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 11:49 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
Нет, не с минимальным id. В поставленной задаче id не имеет значение. Здесь главное Объект. Это сводная таблица Если даже попадутся два одинаковых результата - выбрать нужно любой. Так как в программе номер Объекта играет первостепенную роль. Код: sql 1. 2. Нет результат будет другой, проверено. Смысл подзапроса это формирование временной таблицы, её сортировка в начале по Сделано, потом по Передано, потом GROUP BY берёт первую строку из временной таблицы. Сделано и Передано играют роль раскраски строки в StringGrid. Поэтому и есть приоритет. Вначале передано=0 - цвет оранжевый, а потом уже сделано=1 - зелёный или 2 - серый (отменено). Запрос проверен и работает в программе. Вопрос в оптимизации. Нужна ли оптимизация здесь или этот запрос по скорости имеет окончательный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 12:43 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
982183Я правильно понимаю: Над вывести записи ID с минимальным "сделано", если "сделано несколько", то выбрать с минимальным "передано" в разрезе "объект" Чуть-чуть наоборот :) Надо сформировать группу объектов, где каждому объекту выбрать минимальную "передано" - первую попавшуюся, а после минимально "сделанную" - первую попавшуюся. И получается, что строка в StringGrid разукрасится оранжевым, если хотя бы одна запись заявок для объекта будет не передана. Без DISTINCT это не работает, GROUP BY берёт первую попавшуюся из временной таблицы. Вопрос тогда поставлю по другому: Как заставить GROUP BY взять именно ту запись, учитывая приоритет поставленной задачи. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 13:03 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
Решение! Натолкнул на мысль участник: 982183 Отвечаю сам же :) Исходный неоптимизированный запрос: Код: sql 1. 2. 3. 4. Время выполнения запроса: 634,02 мкс Оптимизированное решение: Код: sql 1. Время выполнения запроса: 379,45 мкс Примечание: Созданные поля min(сделано), min(передано) являются для StringGrid определяющими в раскраске строк. Вопрос закрыт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2018, 17:25 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
В этом случае ты можешь получить id, не соответствующие min(сделано) и min(передано) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2018, 04:25 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
982183В этом случае ты можешь получить id, не соответствующие min(сделано) и min(передано) Хорошо, ещё упрощаю :) Чтобы уже точно никто не подумал более, что мне важен id :) Код: sql 1. P.S.: Таблица сводная. Потом по номеру объекта вычисляются все заявки и выводятся во второй StringGrid, вот там id важен. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2018, 05:27 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
Так это совершенно другая задача. "вывести минимальные (сделано) и (передано) в разрезе объектов" Или на "Вывести минимальную дату(передано) по объектам "в процессе" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2018, 05:44 |
|
||
|
GROUP BY, DISTINCT и ORDER BY (оптимизация)
|
|||
|---|---|---|---|
|
#18+
982183, Да я уже понял, перечитав себя. В следующий раз сформулирую вопрос более конкретно. Как говорится, исправлюсь :) И чтобы ответ был более полный. Запрос: Код: sql 1. Обращение из Delphi: Код: pascal 1. 2. 3. 4. P.S.: поле "контроль" - тип DATETIME. Из всех записей по конкретному объекту ищется максимальная дата по полю "контроль". idсделанопереданообъектконтрольпримечание101400NULL2004001899-12-30 00:00:003114002017-01-29 10:32:254214002018-06-11 11:00:00эта строка будет в поле "контроль" Для Delphi, что 1899-12-30 00:00:00, что NULL это = 0. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2018, 06:06 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39659228&tid=1829800]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
65ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
| others: | 15ms |
| total: | 177ms |

| 0 / 0 |
