powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объединение выборок селектов
12 сообщений из 12, страница 1 из 1
Объединение выборок селектов
    #38901099
Dangera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, у меня имеется 5 таблиц, где t1 связана с t2, а t2 уже в свою очередь связаны с t3,t4,t5, по id, см. ниже

Таблица 1:
id host time1.........

Таблица 2:
(t1.id=t2.id2)
id id2 time2.........

Таблица 3:
(t2.id=t3.id3)
id id3 time3.........

Таблица 4:
(t2.id=t4.id4)
id id4 time4.........

Таблица 5:
(t2.id=t5.id5)
id id5 time5.........

Задача заключается в том, что мне нужно взять определенный промежуток времени и посчитать количество записей удовлетворявших условию в каждой из таблиц, при этом вывод сгрупировать по полю (host) из первой таблицы.

Для выбора количества удовлетворяющих записей я использую такие селекты:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SELECT Host,count(*)
FROM t1
WHERE time1 between '2015-02-03 00:00:00' and '2015-03-10 00:00:00'
GROUP BY host;

SELECT t1.Host,count(*)
FROM t2
LEFT JOIN t1 ON t1.id = t2.id2
WHERE time2 between '2015-02-03 00:00:00' and '2015-03-10 00:00:00'
GROUP BY t1.host;

SELECT t1.Host,count(*)
FROM t3
LEFT JOIN t2 ON t2.id2 = t3.id3
LEFT JOIN t1 ON t1.id = t2.id2
WHERE time3 between '2015-02-03 00:00:00' and '2015-03-10 00:00:00'
GROUP BY t1.host;

SELECT t1.Host,count(*)
FROM t4
LEFT JOIN t2 ON t2.id2 = t4.id4
LEFT JOIN t1 ON t1.id = t2.id2
WHERE time4 between '2015-02-03 00:00:00' and '2015-03-10 00:00:00'
GROUP BY t1.host;

SELECT t1.Host,count(*)
FROM t5
LEFT JOIN t2 ON t2.id2 = t5.id5
LEFT JOIN t1 ON t1.id = t2.id2
WHERE time5 between '2015-02-03 00:00:00' and '2015-03-10 00:00:00'
GROUP BY t1.host;



На выходе получаю 5 массивов:
SELECT 1:
HOSTcount1host1.com3host2.com6host3.com9

SELECT 2:
HOSTcount2host3.com5

SELECT 3:
HOSTcount3host10.com20

SELECT 4:
HOSTcount4host1.com20

SELECT 5:
HOSTcount5host11.com4

Не понятно как проще объединить (свести) все 5 SELECTов по host, что бы на выходе получилось:
HOSTcount1count2count3count4count5host1.com3nullnull20nullhost2.com6nullnullnullnullhost3.com95nullnullnullhost10.comnullnull10nullnullhost11.comnullnullnullnull4

Либо может возможно всё это сделать намного проще?
Заранее спасибо
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901115
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dangera,

LEFT OUTER JOIN

или

FULL OUTER JOIN
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901126
Dangera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivDangera,

LEFT OUTER JOIN

или

FULL OUTER JOIN

FULL OUTER JOIN - В MySQL отказывается работать. Как я понял можно эмулировать через LEFT JOIN + UNION + RIGHT JOIN, но во первых запрос неприлично большой получается, во вторых не совсем понятно на сколько это будет лучше, чем если сделать 5 селектов и потом эти массивы на php уже объединить по хосту.
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901152
Dangera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LEFT OUTER JOIN - В данном случае, я так понимаю, в SELECT 3 есть новый host (host10.com), который через LEFT OUTER JOIN не перейдет в сводную таблицу. Или я ошибаюсь?
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901165
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dangera
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.Host,count(*)
FROM t3
LEFT JOIN t2 ON t2.id2 = t3.id3
LEFT JOIN t1 ON t1.id = t2.id2
WHERE time3 between '2015-02-03 00:00:00' and '2015-03-10 00:00:00'
GROUP BY t1.host;


Эммм... а за каким рожном тут промежуточная t2? Есть ли реальный смысл в этом дополнительном отсечении?
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901200
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DangeraMasterZivDangera,

LEFT OUTER JOIN

или

FULL OUTER JOIN

FULL OUTER JOIN - В MySQL отказывается работать. Как я понял можно эмулировать через LEFT JOIN + UNION + RIGHT JOIN, но во первых запрос неприлично большой получается, во вторых не совсем понятно на сколько это будет лучше, чем если сделать 5 селектов и потом эти массивы на php уже объединить по хосту.

Его там нет. Имитируй UNION.
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901395
Dangera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaЭммм... а за каким рожном тут промежуточная t2? Есть ли реальный смысл в этом дополнительном отсечении?
Промежуточная t2 нужна для того что бы связаться с t1 и достать host. T1 связана с t2, но не связана напрямую с t3-5. Time1-5 разные величины.
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901543
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DangeraПромежуточная t2 нужна для того что бы связаться с t1 и достать host. T1 связана с t2, но не связана напрямую с t3-5. Time1-5 разные величины.
А теперь ВНИМАТЕЛЬНО посмотри на свой запрос. Особливо на секции связывания:
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1.Host,count(*)
FROM t3
LEFT JOIN t2 ON t2.id2 = t3.id3
LEFT JOIN t1 ON t1.id = t2.id2
WHERE time3 between '2015-02-03 00:00:00' and '2015-03-10 00:00:00'
GROUP BY t1.host;


1) t1.id = t2.id2
2) t2.id2 = t3.id3
А теперь догадайся с трёх раз, в каком соотношении находятся значения t1.id и t3.id3.
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901598
Dangera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina, Действительно мой косяк, Запросы были куда более большие и в них были лишние поля, поэтому наскоряк их уменьшил до минимума, и перепутал связь айдишников, когда постил сюда. Естественно там должно быть:
t1.id = t2.id2
и
t2.id = t3.id3
t2.id = t4.id4
t2.id = t5.id5
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901707
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо. Это первый косяк, с ним разобрались.
Теперь второй косяк.
Обрати внимание на любой запрос. Ну скажем на вот этот:
Код: sql
1.
2.
3.
4.
5.
SELECT t1.Host,count(*)
FROM t2
LEFT JOIN t1 ON t1.id = t2.id2
WHERE time2 between '2015-02-03 00:00:00' and '2015-03-10 00:00:00'
GROUP BY t1.host;


Обрати внимание на секцию WHERE. В ней - условие, наложенное на поле из правой таблицы, т.е. по полю t2.time2.
Что автоматически отсекает все записи из левой таблицы, для которых нет соответствия справа - т.е. левое связывание вырождается во внутреннее.
Вопрос - нахрена ты пишешь LEFT join?
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901723
Dangera
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Таблица 1:
idhosttime1.........

Таблица 2:
(t1.id=t2.id2)
idid2time2.........

Left Join я пишу для того что бы завязать вторую таблицу и первую, что бы для всех записей удовлетворяющих условию "WHERE time2 between" он мне выдал host из первой таблицы, иначе как он мне без left join сможет выдернуть хосты.

Или я что то не знаю?
...
Рейтинг: 0 / 0
Объединение выборок селектов
    #38901743
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не знаешь. Замени LEFT на INNER. И попробуй придумать исходные данные, на которых эти версии запросов дадут разные выходные данные.

Придумаешь - не забудь проверить...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Объединение выборок селектов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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