Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 10.02.2018, 21:50   #1
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 257
Репутация: 10
Стрелка Запрос 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 в 21:55.
a.n.o.n.i.m вне форума   Ответить с цитированием
Старый 10.02.2018, 22:13   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,105
Репутация: 5996
По умолчанию

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

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

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

Да там просто 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 в 12:40.
a.n.o.n.i.m вне форума   Ответить с цитированием
Старый 11.02.2018, 13:32   #6
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 257
Репутация: 10
По умолчанию

Такс, такой эксперимент ускорил это дело, с 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 в 14:24.
a.n.o.n.i.m вне форума   Ответить с цитированием
Старый 11.02.2018, 13:53   #7
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 257
Репутация: 10
По умолчанию

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

Если я его чуть меняю на 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 в 14:56.
a.n.o.n.i.m вне форума   Ответить с цитированием
Старый 11.02.2018, 15:54   #9
a.n.o.n.i.m
Форумчанин
 
Регистрация: 26.02.2011
Сообщений: 257
Репутация: 10
По умолчанию

Все, решил
Код:

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 вне форума   Ответить с цитированием
Ответ



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запрос таблицы Марат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




07:26.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
лучший хостинг
Выбираем лучший хостинг: рейтинг ТОП 10
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru