|
|
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
Добрый день, у меня имеется 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. На выходе получаю 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 Либо может возможно всё это сделать намного проще? Заранее спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 12:46:05 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
Dangera, LEFT OUTER JOIN или FULL OUTER JOIN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 12:54:29 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
MasterZivDangera, LEFT OUTER JOIN или FULL OUTER JOIN FULL OUTER JOIN - В MySQL отказывается работать. Как я понял можно эмулировать через LEFT JOIN + UNION + RIGHT JOIN, но во первых запрос неприлично большой получается, во вторых не совсем понятно на сколько это будет лучше, чем если сделать 5 селектов и потом эти массивы на php уже объединить по хосту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 13:00:34 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
LEFT OUTER JOIN - В данном случае, я так понимаю, в SELECT 3 есть новый host (host10.com), который через LEFT OUTER JOIN не перейдет в сводную таблицу. Или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 13:08:03 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
Dangera Код: sql 1. 2. 3. 4. 5. 6. Эммм... а за каким рожном тут промежуточная t2? Есть ли реальный смысл в этом дополнительном отсечении? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 13:14:05 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
DangeraMasterZivDangera, LEFT OUTER JOIN или FULL OUTER JOIN FULL OUTER JOIN - В MySQL отказывается работать. Как я понял можно эмулировать через LEFT JOIN + UNION + RIGHT JOIN, но во первых запрос неприлично большой получается, во вторых не совсем понятно на сколько это будет лучше, чем если сделать 5 селектов и потом эти массивы на php уже объединить по хосту. Его там нет. Имитируй UNION. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 13:24:48 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
AkinaЭммм... а за каким рожном тут промежуточная t2? Есть ли реальный смысл в этом дополнительном отсечении? Промежуточная t2 нужна для того что бы связаться с t1 и достать host. T1 связана с t2, но не связана напрямую с t3-5. Time1-5 разные величины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 14:41:28 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
DangeraПромежуточная t2 нужна для того что бы связаться с t1 и достать host. T1 связана с t2, но не связана напрямую с t3-5. Time1-5 разные величины. А теперь ВНИМАТЕЛЬНО посмотри на свой запрос. Особливо на секции связывания: Код: sql 1. 2. 3. 4. 5. 6. 1) t1.id = t2.id2 2) t2.id2 = t3.id3 А теперь догадайся с трёх раз, в каком соотношении находятся значения t1.id и t3.id3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 16:13:01 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
Akina, Действительно мой косяк, Запросы были куда более большие и в них были лишние поля, поэтому наскоряк их уменьшил до минимума, и перепутал связь айдишников, когда постил сюда. Естественно там должно быть: t1.id = t2.id2 и t2.id = t3.id3 t2.id = t4.id4 t2.id = t5.id5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 16:54:16 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
Хорошо. Это первый косяк, с ним разобрались. Теперь второй косяк. Обрати внимание на любой запрос. Ну скажем на вот этот: Код: sql 1. 2. 3. 4. 5. Обрати внимание на секцию WHERE. В ней - условие, наложенное на поле из правой таблицы, т.е. по полю t2.time2. Что автоматически отсекает все записи из левой таблицы, для которых нет соответствия справа - т.е. левое связывание вырождается во внутреннее. Вопрос - нахрена ты пишешь LEFT join? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 18:24:12 |
|
||
|
Объединение выборок селектов
|
|||
|---|---|---|---|
|
#18+
Akina, Таблица 1: idhosttime1......... Таблица 2: (t1.id=t2.id2) idid2time2......... Left Join я пишу для того что бы завязать вторую таблицу и первую, что бы для всех записей удовлетворяющих условию "WHERE time2 between" он мне выдал host из первой таблицы, иначе как он мне без left join сможет выдернуть хосты. Или я что то не знаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2015, 18:39:11 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38901543&tid=1833457]: |
0ms |
get settings: |
8ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 309ms |

| 0 / 0 |
