Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Многотабличный запрос (MySQL)


Страницы:   1 2 3

Юрий ©   (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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо