|
Модераторы: skyboy |
|
s1lver |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Доброго времени суток!
Необходимо выбрать последние записи из таблицы для каждого идентификатора(количество идентификаторов может различаться каждый раз).
Сделал используя UNION так:
Запрос возвращает правильные данные. Но, хотелось бы, используя IN, как-то так:
В этом случае, тоже работает, но только, естественно, возвращает первые записи. Подскажите, пожалуйста, как можно поправить в этом случае? -------------------- Я собрался жить вечно - пока все идет нормально! |
||||||
|
|||||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 453 |
См. тут.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
tzirechnoy |
|
||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
(в приличных серверах второй код не заработает, кстати, поскольку поле в ORDER, да и поле в SELECT несгруппированы в запросе с группировкой)
Есть, правда, такая деталь, что если дата неуникальна, то выдаст всё за последнюю дату, но это не всегда плохо по факту. А если плохо -- то можно ещё добавить фильтр по любому уникальному ключу:
И вторая деталь -- часто в серверах проблема с тем, чтобы понять что оператор max требует одной выборки по ключу (и вообще с оптимизацыей групповых операторов), потому для скорости можэт иметь смысл переписать SELECT max(date) FROM ... WHERE на ваш SELECT date FROM ... WHERE ... ORDER BY date DESC LIMIT 1. |
||||
|
|||||
s1lver |
|
|||
Опытный Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Вот, еще вариант получился
Как бы, даже, возвращает правильные данные Добавлено @ 12:33 Akina, tzirechnoy, Теперь еще "хуже". Есть три варианта, которые возвращают нужные данные, проблема какой использовать. Это сообщение отредактировал(а) s1lver - 3.2.2016, 12:37 -------------------- Я собрался жить вечно - пока все идет нормально! |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 453 |
Внимательно прочитайте по ссылке варианты постановки задачи и проверьте, ту ли задачу решаете в каждом из вариантов. А вот это уже зависит от конкретной системы - начиная с наполнения таблиц и кончая аппаратной конфигой. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
s1lver |
|
||||||
Опытный Профиль Группа: Участник Сообщений: 580 Регистрация: 14.12.2007 Где: Россия Репутация: нет Всего: нет |
Кстати, если необходимо выбрать записи за вчерашний день, то получается как-то так?
На первый взгляд, возвращаемые данные правильные
Судя по всему, все правильно. Это сообщение отредактировал(а) s1lver - 3.2.2016, 13:16 -------------------- Я собрался жить вечно - пока все идет нормально! |
||||||
|
|||||||
tzirechnoy |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: 2 Всего: 16 |
Как бы нет. То есть он возвращает имено данные для самого большого id, а не самой большой даты. А ORDER BY -- вообще не работает, и правильный сервер об этом бы сказал. Переделать на дату -- можно. Разница с подзапросом в WHERE будет в том, что в одном случае для поиска максимальных дат оптимизатор скорее всего один раз пройдёт по product, получив список дат по номенклатурам, а в другом -- столько раз, сколько нужно номенклатур, пройдёт по ключу, свзязанному с номенклатурой. В общем, по скорости можэт быть лучшэ и так и так -- в зависимости от селективности номенклатуры и количества их в одном запросе. Правда, подзапрос в WHERE можно переделать на ORDER BY ... LIMIT 1, и заставить использовать индэкс, а во FROM по-моему это тяжэловато. |
|||
|
||||
Akina |
|
||||||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 453 |
Ахринеть... а почему не просто просто
? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||||
|
|||||||
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |