Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2018, 20:50   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
Стрелка Запрос 2 таблицы

Помогите составить запрос.
Вот есть две таблицы.

В первой есть столбец со временем в utc формате, число вообщем, например 1380013740

Во второй таблице так же есть столбец со временем в utc формате и другие данные.


Нужно вывести в качестве результата следующую информацию:

Берется время из таблицы 1. Например это 1380013740. Далее в таблице 2 ищутся все записи попавшие в интервал от 1380013740 - 60 до 1380013740

Итак надо по каждому времени из таблицы 1 составить выборку строк из таблицы 2 , попавшую в интервал данный. То есть на выходе хочу получить такую выборку: время - данные(строчки попавшие в интервал из таблицы 2)


Как такое сделать?

Что то типа такого, но это не то
Код:
SELECT cpu_logs.log_time, logs_data.ip, logs_data.page, cpu_logs.last_request 
FROM cpu_logs, logs_data 
WHERE logs_data.log_time BETWEEN cpu_logs.log_time - 60 AND cpu_logs.log_time

Последний раз редактировалось a.n.o.n.i.m; 10.02.2018 в 20:55.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 10.02.2018, 21:13   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
но это не то
в чем заключается это не то?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.02.2018, 09:53   #3
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Да таблицы не связаны по индексу. Запрос не известно сколько работает данный. Я не смог дождаться. Записей то всего по 25к в каждой таблице всего. Как можно выйти в из данной ситуации и получить все таки выборку?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 11.02.2018, 10:48   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

По индексу таблицы и не связываются. А вот индексы в таблицах создать то можно, по log_time например. Не факт, что поможет из-за выражения во where. И вообще-то не зная структуры таблиц и логику информации в них трудно что-то рекомендовать. В условии твоем возможно еще должно что-то быть
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.02.2018, 11:35   #5
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Да там просто 2 никак не связанные таблицы, по log_time я не могу связать так как это разные времена.

Сделал так, в 1 таблице ограничил максимально выборку, получилось с 25000 строк всего где то 100
Причем этот запрос вообще моментально выполняется.
Код:
SELECT cpu_logs.log_time, cpu_logs.cpu, cpu_logs.command, cpu_logs.last_request 
	FROM (SELECT MIN(log_time) as minimum, MAX(log_time) as maximum FROM `logs_data`) AS logs_data_table, cpu_logs
		WHERE cpu_logs.last_request like '%dgp2.ru%' 
        	AND cpu_logs.log_time BETWEEN logs_data_table.minimum AND logs_data_table.maximum
И теперь надо уже сделать выборку уже получается таблица 1 - 100 записей, таблица 2 - 25к записей, поидее вообще пустяк какой то.

Но если я сделаю так
Код:
SELECT cpu_logs_table.log_time, logs_data.ip, logs_data.page, cpu_logs_table.last_request 
	FROM (SELECT cpu_logs.log_time, cpu_logs.cpu, cpu_logs.command, cpu_logs.last_request 
		FROM (SELECT MIN(log_time) as minimum, MAX(log_time) as maximum FROM `logs_data`) AS logs_data_table, cpu_logs 
		WHERE cpu_logs.last_request like '%dgp2.ru%' AND cpu_logs.log_time BETWEEN logs_data_table.minimum AND logs_data_table.maximum) AS cpu_logs_table, logs_data 
	WHERE logs_data.log_time BETWEEN (cpu_logs_table.log_time - 60) AND (cpu_logs_table.log_time)
Запрос ну очень долго выполняется, несколько минут буквально, можно как то оптимизировать это дело?

Последний раз редактировалось a.n.o.n.i.m; 11.02.2018 в 11:40.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 11.02.2018, 12:32   #6
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Такс, такой эксперимент ускорил это дело, с LEFT JOIN

Код:
SELECT cpu_logs_table.log_time, b1.log_time, b1.ip, b1.page, cpu_logs_table.last_request 
FROM
(SELECT cpu_logs.log_time, cpu_logs.cpu, cpu_logs.command, cpu_logs.last_request 
	FROM (SELECT MIN(log_time) as minimum, MAX(log_time) as maximum FROM `logs_data`) AS logs_data_table, cpu_logs
		WHERE cpu_logs.last_request like '%dgp2.ru%' 
        	AND cpu_logs.log_time BETWEEN logs_data_table.minimum AND logs_data_table.maximum) AS cpu_logs_table
LEFT JOIN logs_data AS b1 ON (b1.log_time BETWEEN (cpu_logs_table.log_time - 60) AND (cpu_logs_table.log_time))
Рою дальше. Работает вроде быстрро, но дублирует записи почему то

Последний раз редактировалось a.n.o.n.i.m; 11.02.2018 в 13:24.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 11.02.2018, 12:53   #7
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Можете подсказать как избежать дублирование записей?
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 11.02.2018, 13:52   #8
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Если я его чуть меняю на left join работает практически моментально, но каждую запись выводит по два раза
Код:
SELECT cpu_logs_table.log_time, b1.log_time, b1.ip, b1.page, cpu_logs_table.last_request 
FROM
(SELECT cpu_logs.log_time, cpu_logs.cpu, cpu_logs.command, cpu_logs.last_request 
	FROM (SELECT MIN(log_time) as minimum, MAX(log_time) as maximum FROM `logs_data`) AS logs_data_table, cpu_logs
		WHERE cpu_logs.last_request like '%dgp2.ru%' 
        	AND cpu_logs.log_time BETWEEN logs_data_table.minimum AND logs_data_table.maximum) AS cpu_logs_table
LEFT JOIN logs_data AS b1 ON (b1.log_time BETWEEN (cpu_logs_table.log_time - 60) AND (cpu_logs_table.log_time))
Как избежать вывода по два раза каждой записи?

Последний раз редактировалось a.n.o.n.i.m; 11.02.2018 в 13:56.
a.n.o.n.i.m вне форума Ответить с цитированием
Старый 11.02.2018, 14:54   #9
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 301
По умолчанию

Все, решил
Код:
SELECT cpu_logs_table.log_time, logs_data.log_time, logs_data.ip, logs_data.page
FROM
(SELECT cpu_logs.log_time
	FROM (SELECT MIN(log_time) as minimum, MAX(log_time) as maximum FROM `logs_data`) AS logs_data_table, cpu_logs
		WHERE cpu_logs.last_request like '%dgp2.ru%' 
    	AND cpu_logs.log_time BETWEEN logs_data_table.minimum AND logs_data_table.maximum GROUP BY cpu_logs.log_time) AS cpu_logs_table
LEFT JOIN logs_data ON (logs_data.log_time BETWEEN (cpu_logs_table.log_time - 300) AND (cpu_logs_table.log_time + 60))  
ORDER BY cpu_logs_table.log_time, logs_data.log_time ASC
может кому то полезно будет
a.n.o.n.i.m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос таблицы Марат05 C++ Builder 7 11.02.2013 18:06
1 запрос 2 таблицы Abuhamed PHP 8 04.10.2012 12:52
Mysql запрос на 2 таблицы Abuhamed PHP 1 21.08.2012 08:52
Запрос на обновление таблицы IgoreKMaN БД в Delphi 12 27.04.2012 00:05
Многократное включение таблицы в запрос Kofer SQL, базы данных 0 14.08.2008 22:59