в базе хранятся результаты измерения некоторых параметров. причем измерения проводятся с нескольких устройств.
структура таблицы такова
Код: Выделить всё
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, минуя обработку данных скриптом?