| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > [MySQL] Выборка последних записей в GROUP BY |
| Автор: s1lver 3.2.2016, 12:11 | ||||||
| Доброго времени суток! Необходимо выбрать последние записи из таблицы для каждого идентификатора(количество идентификаторов может различаться каждый раз).
Сделал используя UNION так:
Запрос возвращает правильные данные. Но, хотелось бы, используя IN, как-то так:
В этом случае, тоже работает, но только, естественно, возвращает первые записи. Подскажите, пожалуйста, как можно поправить в этом случае? |
| Автор: Akina 3.2.2016, 12:16 |
| См. http://www.sql.ru/forum/687908-a/faq-vyborka-pervoy-posledney-zapisi-v-gruppah. |
| Автор: tzirechnoy 3.2.2016, 12:23 | ||||
(в приличных серверах второй код не заработает, кстати, поскольку поле в ORDER, да и поле в SELECT несгруппированы в запросе с группировкой)
Есть, правда, такая деталь, что если дата неуникальна, то выдаст всё за последнюю дату, но это не всегда плохо по факту. А если плохо -- то можно ещё добавить фильтр по любому уникальному ключу:
И вторая деталь -- часто в серверах проблема с тем, чтобы понять что оператор max требует одной выборки по ключу (и вообще с оптимизацыей групповых операторов), потому для скорости можэт иметь смысл переписать SELECT max(date) FROM ... WHERE на ваш SELECT date FROM ... WHERE ... ORDER BY date DESC LIMIT 1. |
| Автор: s1lver 3.2.2016, 12:29 | ||
Вот, еще вариант получился
Как бы, даже, возвращает правильные данные Добавлено @ 12:33 Akina, tzirechnoy, Теперь еще "хуже". Есть три варианта, которые возвращают нужные данные, проблема какой использовать. |
| Автор: Akina 3.2.2016, 12:57 |
Внимательно прочитайте по ссылке варианты постановки задачи и проверьте, ту ли задачу решаете в каждом из вариантов. А вот это уже зависит от конкретной системы - начиная с наполнения таблиц и кончая аппаратной конфигой. |
| Автор: s1lver 3.2.2016, 13:14 | ||||||
Кстати, если необходимо выбрать записи за вчерашний день, то получается как-то так?
На первый взгляд, возвращаемые данные правильные
Судя по всему, все правильно. |
| Автор: tzirechnoy 3.2.2016, 13:17 | ||
Как бы нет. То есть он возвращает имено данные для самого большого id, а не самой большой даты. А ORDER BY -- вообще не работает, и правильный сервер об этом бы сказал. Переделать на дату -- можно. Разница с подзапросом в WHERE будет в том, что в одном случае для поиска максимальных дат оптимизатор скорее всего один раз пройдёт по product, получив список дат по номенклатурам, а в другом -- столько раз, сколько нужно номенклатур, пройдёт по ключу, свзязанному с номенклатурой. В общем, по скорости можэт быть лучшэ и так и так -- в зависимости от селективности номенклатуры и количества их в одном запросе. Правда, подзапрос в WHERE можно переделать на ORDER BY ... LIMIT 1, и заставить использовать индэкс, а во FROM по-моему это тяжэловато. |
| Автор: Akina 3.2.2016, 14:33 | ||||||
Ахринеть... а почему не просто просто
? |