MYSQL: представление данных в определенном формате (представление данных в формате, необходимому заказчику)

Модератор: Модераторы разделов

Аватара пользователя
S7a1k3r
Сообщения: 159
Статус: Белгородский LUG
ОС: Arch Linux

MYSQL: представление данных в определенном формате

Сообщение S7a1k3r »

Итак. доброго времени суток. собственно вопрос
в базе хранятся результаты измерения некоторых параметров. причем измерения проводятся с нескольких устройств.
структура таблицы такова

Код: Выделить всё

create table attr_change(
`id` int(10) unsigned NOT NULL auto_increment,
`attr_data_id` int(10) unsigned default NULL,//id параметра, ссылается на таблицу attr_data
`value` tinyint(4) unsigned default NULL,//значение параметра в момент измерения
`date_change` datetime default NULL,//дата изменения
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`attr_data_id`,`date_change`),
)

create table attr_data(
`id` int(10) unsigned NOT NULL auto_increment,
`engine_id` int(10),
//another field (остальные служебные поля)
)

нужно сделать выборку таким образом, чтобы данные были представлены следующим образом

Код: Выделить всё

attr1 | attr2 | attr3 | ... | attrN | date
val1 | val2 | val3 | ... | valN | date

причем date в данном представлении данных - это поле, содержащее даты изменений.
если аттрибут не изменялся в этот момент времени, то наместе valX ставим либо NULL либо другое уникальное значение, не встречающееся в поле value.

например так

Код: Выделить всё

attr1 | attr2 | attr3 | date
12 | NULL | 15 | 12:03
18 | 85 | NULL | 13:04

в таблице attr_change это представлено как

Код: Выделить всё

attr_data_id | value | date_change
1 | 12 | 12:03
3 | 15 | 12:03
1 | 18 | 12:04
2 | 85 | 12:04

(остальные поля не показаны)

возникает проблема представления данных в нужном формате.
число измеряемых атрибутов у каждого устройства разное.
сначала была мысль делать left outer join таблицы с самой собой
т.е.
сделать представление

Код: Выделить всё

create view selector as
select attr_change.attr_data_id,attr_change_value,attr_change.date_change from attr_change join attr_data
on attr_change.attr_data_id = attr_data.id;

Код: Выделить всё

select a.value,t.* from (selector) as a left outer join (select distinct date_change from selector) as t where a.attr_data_id = 1) (1)

select (select a.value,t.* from (selector) as a left outer join (X) as t where a.attr_data_id = 2) (2)

где на мето X подставляем запрос (1)

Код: Выделить всё

select (select a.value,t.* from (selector) as a left outer join (Y) as t where a.attr_data_id = 3) (3)

где на мето Y подставляем запрос (2)

и так далее...

т.е. сначала нужно сгенеривоть такой запрос, имеющий до 200 вложенных селектов, а потом его выполнить. притаком способе максимальное число вложенных селектов, с которыми mysql согласился работать составило порядка 50. время на выполнение... достаточно большое.
сейчас постобработкой данных занимается скрипт на php, который из представления selector формирует необходимую таблицу.

окончательный вопрос таков: возможно ли реализовать подобную выборку средствами исключительно mysql, минуя обработку данных скриптом?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: MYSQL: представление данных в определенном формате

Сообщение KiWi »

Быстро -- нет.
Спасибо сказали:
Аватара пользователя
S7a1k3r
Сообщения: 159
Статус: Белгородский LUG
ОС: Arch Linux

Re: MYSQL: представление данных в определенном формате

Сообщение S7a1k3r »

KiWi писал(а):
01.05.2008 21:35
Быстро -- нет.

насчет этого утверждения полностью согласен.

вопрос я задал скорее из любопытства. нежели из практических соображений.
мускули делают выборку по тому методу, как я описал, в течении 30 секунд.
php обрабатывает данные (сырые, которые выдает представление) менее чем за секунду.
ЗЫ: размер таблицы порядка 20ГБ и продолжает неуклонно расти. а выборка должна осуществляться за приемлемое время.
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: MYSQL: представление данных в определенном формате

Сообщение KiWi »

S7a1k3r писал(а):
01.05.2008 21:40
ЗЫ: размер таблицы порядка 20ГБ и продолжает неуклонно расти. а выборка должна осуществляться за приемлемое время.

На PHP вывод осуществляется за 1 проход по всем строчкам(при некоторой сортировке запросе) без доп. массивов и тп(если нужно только выводить). Плюс ещё 1 запрос, чтобы узнать количество атрибутов.
Спасибо сказали:
Аватара пользователя
S7a1k3r
Сообщения: 159
Статус: Белгородский LUG
ОС: Arch Linux

Re: MYSQL: представление данных в определенном формате

Сообщение S7a1k3r »

KiWi писал(а):
01.05.2008 23:58
S7a1k3r писал(а):
01.05.2008 21:40
ЗЫ: размер таблицы порядка 20ГБ и продолжает неуклонно расти. а выборка должна осуществляться за приемлемое время.

На PHP вывод осуществляется за 1 проход по всем строчкам(при некоторой сортировке запросе) без доп. массивов и тп(если нужно только выводить). Плюс ещё 1 запрос, чтобы узнать количество атрибутов.

так ведь так и делаетсо.
сейчас постобработкой данных занимается скрипт на php, который из представления selector формирует необходимую таблицу.

окончательный вопрос таков: возможно ли реализовать подобную выборку средствами исключительно mysql, минуя обработку данных скриптом?


только несколько иначе
первый - их имена и id. (при выводе имен подсчитываю количество атрибутов)
второй запрос - сами значения, отсортированные сначала по дате, а потом по attr_data_id (дабы выводились в правильном порядке).

только я хотел узнать. возможно ли это сделать корректно имея в своем распоряжении только средства sql, не прибегая к помощи скриптов. (исключительно из любопытства)
Спасибо сказали: