![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многотабличный запрос (MySQL)
Юрий © (2007-04-18 09:59:00)Имеется несколько таблиц в одной базе данных. Все столбцы таблиц одинаковы (и по имени, и по типу хранимых данных). Необходимо из всех этих таблиц выбрать группу данных, удовлетворяющих условию, и сгруппировать по другому полю.
(SELECT * FROM table1 WHERE some_field1='ok' GROUP BY some_field2)
UNION ALL
(SELECT * FROM table2 WHERE some_field1='ok' GROUP BY some_field2)
UNION ALL
...
Соответственно, получаем в результирующем наборе данных две копии группировок по полю some_field2:
1
2
3
1
2
3
...
Конечно, можно убрать UNION ALL и написать UNION, но тогда убираются всеидентичные строки по всем столбцам, а не только по полю some_field2.
Вопрос: можно ли от этого избавиться или нужен другой подход? Если да, то какой.
PS. СУБД - MySQL 5.x
Юрий (2007-04-18 14:03:00) [1]> [40] Jan1 (18.04.07 13:57)
> Ну так в перед: сливайте все в одну таблицу и делайте подсчет
> одним запросом.
Меня интересовало можно ли это сделать без сливания, вдруг я чего не знаю. :)
Jan1 (2007-04-18 13:57:00) [2]Ну так в перед: сливайте все в одну таблицу и делайте подсчет одним запросом.
Юрий (2007-04-18 13:55:00) [3]> [38] Jan1 (18.04.07 13:53)
> ну или ПХП. можно и н а сервак это можно возложить, но я
> так понял Вы прав не имеете?
Можно возложить и на сервер, права найдутся. Смысл в том, что создатели СУБД наверняка разбор сделали гораздо быстрее, и уж точно не на PHP.
Jan1 (2007-04-18 13:53:00) [4]
> Самый лучший способ всё-таки возложить на MySQL, разбирать
> данные тихим скриптом PHP не кошерно.
ну или ПХП. можно и н а сервак это можно возложить, но я так понял Вы прав не имеете?
Юрий (2007-04-18 13:46:00) [5]> [36] Jan1 (18.04.07 13:09)
> Ну тогда ед. решение - получить одним запрососм где будет
> UNION ALL а на клиенте руцями пройтись и просуммировать...
Думал и про это, не элегатно получается. Да и там могут быть случаи, когда информации очень много, и если учитывать, что сервер с этими таблицами разделён с сервером, на котором мой скрипт, то развивается неслабый траффик. Самый лучший способ всё-таки возложить на MySQL, разбирать данные тихим скриптом PHP не кошерно.
Jan1 (2007-04-18 13:09:00) [6]Ну тогда ед. решение - получить одним запрососм где будет UNION ALL а на клиенте руцями пройтись и просуммировать...
Юрий (2007-04-18 11:26:00) [7]У меня мануал от 5.0.6 beta, там говорится что хранимые процедуры планируется реализовать в MySQL 5.0. =)
Юрий (2007-04-18 11:20:00) [8]> [32] Jan1 (18.04.07 11:14)
> ну если MySQL поддерживает временные таблицы
Это и хотелось узнать, т.к. чтение мануала не натолкнуло на правильный путь. Хотя возможно надо просто усердней читать.
Юрий (2007-04-18 11:17:00) [9]> [31] Jan1 (18.04.07 11:13)
>
> зачем временную, сделай навсегда. удали расплодившиеся таблицы
> - сведи все в одну кучу. а старые удали. и все будет пучком.
Я несколько неправильно выразился. Соединить бы все данные, из всех таблиц, а уж к ним применить:
SELECT COUNT(*) as error_count FROM (тут все данные) WHERE check='not_ok' AND timestamp >= '2007-04-12' AND timestamp <= '2007-04-16' GROUP BY HOUR(timestamp)
Создавать, удалять, изменять нельзя. Допустим таблицы read only.
Jan1 (2007-04-18 11:14:00) [10]
> Допустим структуру менять нельзя.
ну если MySQL поддерживает временные таблицы, то тогда только их. Ну или ХП попробовать,в 5-ке они должны быть.
Jan1 (2007-04-18 11:13:00) [11]
> У меня была мысль, если сделать временную таблицу с записями
> прошедших проверку на условие, а уж эту таблицу группировать
> по часам, и считать количество ошибок в часе.
зачем временную, сделай навсегда. удали расплодившиеся таблицы - сведи все в одну кучу. а старые удали. и все будет пучком.
> Именно этого.
ок.
Юрий (2007-04-18 11:11:00) [12]> [27] Jan1 (18.04.07 11:04)
> текущая структура пройдет, го если нет то думаю у тебе надо
> сделать сводную таблицу, точно такую же как и сейчас с единственным
> дополнением - поле признак
Допустим структуру менять нельзя.
Юрий (2007-04-18 11:07:00) [13]> [27] Jan1 (18.04.07 11:04)
> если MySQL поддерживает select * from (select * from ),
> то текущая структура пройдет, го если нет то думаю у тебе
> надо сделать сводную таблицу, точно такую же как и сейчас
> с единственным дополнением - поле признак, кто писал ошибку,
> допустим ссылка на справочник источников. тогда тебе не
> надо плодить таблицы и ты сможешь вытащить интересующую
> тебя информацию одним запросом.
У меня была мысль, если сделать временную таблицу с записями прошедших проверку на условие, а уж эту таблицу группировать по часам, и считать количество ошибок в часе.
И ещё "select * from (select * from )" не поддерживается.
> [28] Jan1 (18.04.07 11:04)
Именно этого.
Jan1 (2007-04-18 11:04:00) [14]
> Ничего, в результат ничего не попадает, для этого часа записи
> в выводе просто не будет.
правильно. этого ли ты ожидаешь?
Jan1 (2007-04-18 11:04:00) [15]
> Прошу прощенья. Переходя к нескольким таблицам - как это
> организовать?
если MySQL поддерживает select * from (select * from ), то текущая структура пройдет, го если нет то думаю у тебе надо сделать сводную таблицу, точно такую же как и сейчас с единственным дополнением - поле признак, кто писал ошибку, допустим ссылка на справочник источников. тогда тебе не надо плодить таблицы и ты сможешь вытащить интересующую тебя информацию одним запросом.
Юрий (2007-04-18 11:02:00) [16]Ничего, в результат ничего не попадает, для этого часа записи в выводе просто не будет.
Jan1 (2007-04-18 11:01:00) [17]
> Интересует, никто не мешает сделать так:
что ты будешь делать если за определенный час не было записей?
Юрий (2007-04-18 11:00:00) [18]> [23] Jan1 (18.04.07 10:59)
Прошу прощенья. Переходя к нескольким таблицам - как это организовать?
Jan1 (2007-04-18 10:59:00) [19]
> Интересует, никто не мешает сделать так:
так ты и пиши то что тебя интересует - оно мне надо выуживать из тебя информацию? а?
Юрий (2007-04-18 10:57:00) [20]> [21] Jan1 (18.04.07 10:54)
Интересует, никто не мешает сделать так:
SELECT HOUR(timestamp) as my_group, COUNT(*) as error_count FROM table WHERE check='not_ok' AND timestamp >= '2007-04-12' AND timestamp <= '2007-04-16' GROUP BY my_group