Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом / 11 сообщений из 11, страница 1 из 1
20.12.2017, 17:53
    #39572977
Sergtep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Добрый день!

Есть таблица logins

id,name,data,status

1,a,2017-20-12 12:00:00,0
2,a,2017-20-12 12:00:01,1
3,b,2017-20-12 12:00:07,0
4,b,2017-20-12 12:00:10,1
5,d,2017-20-12 12:00:13,0
6,e,2017-20-12 12:00:17,0
7,e,2017-20-12 12:00:19,1
8,f,2017-20-12 12:00:21,0
9,g,2017-20-12 12:00:24,0
10,g,2017-20-12 12:00:27,1
....

Как то одним запросом можно вывести строки, где status = 0, но при этом нет в диапазоне +-5 сек такого же имени с status=1
Т.е тут запрос должен вывести cтроки с name=d и f
...
Рейтинг: 0 / 0
20.12.2017, 19:48
    #39573021
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select t1.*
from logins t1
where t1.status = 0
  and not exists (
                   select 1
                   from logins t2
                   where t1.name = t2.name
                     and t2.status = 1
                     and t2.data between t1.data - interval 5 second and t1.data + interval 5 second
                   )
...
Рейтинг: 0 / 0
21.12.2017, 10:21
    #39573322
Sergtep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Akina, спасибо
Сделал вчера точно также, но уж больно долго выполняется (((
В таблице >400 тыс записей, время выполнения 10-20 сек, если брать дату, например за сегодня или со вчера.
...
Рейтинг: 0 / 0
21.12.2017, 10:35
    #39573333
Помогите с запросом
Sergtep,

not exists - суть есть подзапрос и часто выполняется через нестед-лупы от "основной" (внешней таблицы) к "подзапросной"(вложенной)
и тут нужен либо индекс по logins, идеально покрывающий условия exists-подзапроса, либо нужно переписать not exists-подзапрос на left join semi
...
Рейтинг: 0 / 0
21.12.2017, 11:22
    #39573362
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Добрый Э - Эхлибо нужно переписать not exists-подзапрос на left join semi
Вы так говорите, будто mysql умеет делать join хоть каким-нибудь другим способом кроме nested loops
...
Рейтинг: 0 / 0
21.12.2017, 12:08
    #39573424
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
SergtepВ таблице >400 тыс записей, время выполнения 10-20 сек, если брать дату, например за сегодня или со вчера.Так добавь в запрос дополнительный отбор по дате-то...
Впрочем, это слабо поможет - связывание по выражению есть фуллскан как минимум по одной из таблиц. Если это постоянная операция - я бы предложил добавить предрасчётное (SET?) поле с флагом отбора по заданному критерию.
...
Рейтинг: 0 / 0
21.12.2017, 13:29
    #39573543
Sergtep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Попробовал LEFT JOIN результат такой же
Чуть быстрее (15-20%) если использовать NOT IN

Как еще ускорить не знаю(
...
Рейтинг: 0 / 0
21.12.2017, 13:43
    #39573560
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
SergtepПопробовал LEFT JOINПокажите, как именно.
...
Рейтинг: 0 / 0
21.12.2017, 13:58
    #39573585
Sergtep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Код: sql
1.
2.
3.
4.
select t1.* from logins t1
left join logins t2 on t1.name = t2.name and t2.status = 1 and t2.data > '2017-12-21' and 
t2.data between t1.data - interval 5 second and t1.data + interval 5 second 
where t1.status = 0 and t1.data > '2017-12-21' and t2.id IS NULL



Код: sql
1.
2.
3.
4.
5.
select t1.* from logins t1 
where t1.status = 0 and t1.data > '2017-12-21' and t1.name NOT IN (
                          select t2.name from logins t2 
                          where t2.status = 1 and t2.data > '2017-12-21' and 
                          t2.data between t1.data - interval 5 second and t1.data + interval 5 second )
...
Рейтинг: 0 / 0
21.12.2017, 14:50
    #39573651
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
А сколько записей отбирает условие data > '2017-12-21'?
...
Рейтинг: 0 / 0
21.12.2017, 16:07
    #39573773
Sergtep
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
около 12 тыс
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите с запросом / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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