powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Избавится от SELECT в выражении WHERE
2 сообщений из 2, страница 1 из 1
Избавится от SELECT в выражении WHERE
    #39650189
sergey-iv3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая таблица в БД:

|UserId |DateTo |serviceCode|status|lastDate | |116750128|2018-03-11 22:00:00|PE0753.24 |1 |2018-02-12 20:31:43| |116750128|2018-03-29 22:00:00|PE0753.24 |1 |2018-01-29 22:00:00| |116750128|2038-01-19 06:14:07|PE0753.24 |1 |2018-01-30 22:00:00|

Необходимо выбрать lastDate только у тех записей, у которых `DateTo` равна максимуму среди `DateTo` которые относятся к `UserId`, `serviceCode` и `status`.

Т.е. в данном случае должно вернутся `2018-01-30 22:00:00`, т.к. DateTo=2038-01-19 06:14:07 максимуму, среди UserId=116750128 и serviceCode=PE0753.24 и status=1.

Смог придумать такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    SELECT
      p1.lastDate, p1.UserId, p1.serviceCode
    FROM Users.UserInfo p1
    WHERE
      p1.status= 1
      AND p1.UserId>= 116750128
      AND p1.UserId< 116750129
      AND p1.DateTo= (SELECT max(p2.dateTo) FROM Users.UserInfo p2
                          WHERE p2.UserId= p1.UserId
                                AND p2.status= p1.status
                                AND p2.serviceCode= p1.serviceCode);



Может есть способ получше, не нравится подселект в конструкции WHERE. Данный запрос долго отрабатывает на таблице с порядком 200 млн записей.
...
Рейтинг: 0 / 0
Избавится от SELECT в выражении WHERE
    #39650195
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergey-iv3,

Показывайте DDL таблиц и план запроса.

Как вариант, запрос можно переписать так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
      p1.lastDate, p1.UserId, p1.serviceCode
    FROM Users.UserInfo p1
    WHERE
      p1.status= 1
      AND p1.UserId>= 116750128
      AND p1.UserId< 116750129
      AND NOT EXISTS (SELECT NULL FROM Users.UserInfo p2
                                WHERE p2.UserId= p1.UserId
                                AND p2.status= p1.status
                                AND p2.serviceCode= p1.serviceCode
                                AND 2.DateTo>p1.DateTo)
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Избавится от SELECT в выражении WHERE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]