Как сформировать запрос к MySQL таблице?

Добрый день,
возник вопрос по поводу множественного запроса к одной таблице, а конкретнее есть таблица представленная в виде
CREATE TABLE IF NOT EXISTS `testtable` (
  `Name` text,
  `ID` int(11) NOT NULL,
  `VALUE` int(11) NOT NULL,
  `TIME` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `testtable` (`Name`, `ID`, `VALUE`, `TIME`) VALUES
	('Name2', 1, 1, '0000-00-00 00:00:00'),
	('Name2', 1, 2, '0000-00-00 00:00:01'),
	('Name1', 1, 2, '0000-00-00 00:00:01'),
	('Name3', 2, 3, '0000-00-00 00:00:02'),
	('Name3', 2, 4, '0000-00-00 00:00:03'),
	('Name1', 2, 3, '0000-00-00 00:00:02'),
	('Name1', 1, 1, '0000-00-00 00:00:00'),
	('Name1', 2, 4, '0000-00-00 00:00:03');

Как видно в каждый момент времени в таблицу записываются значения некоторых переменных, набор переменных может меняться и в этом заключается основная проблема. Как сделать запрос к бд, устойчивый к отсутствию некоторых переменных в разных сессиях записи (идентифицируются по id) чтобы получить таблицу такого вида:
Id | Name1 | Name2 | Name3 | DateTime
1 | 1 | 1 | null | 00
1 | 2 | 2 | null | 01
2 | 3 | null | 3 | 03
2 | 4 | null | 4 | 04

Наличие столбцов, не имеющих значения не обязательно, главное чтобы в схеме все корректно соотносилось.
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
При динамическом наборе переменных - только сначала считывать список имён переменных, затем строить запрос вида
SELECT `t`.`ID`, `t1`.`VALUE`, `t2`.`VALUE`, ..., `tN`.`VALUE`, `t`.`TIME`
  FROM (
    SELECT DISTINCT `ID`, `TIME`
      FROM `testtable` 
  ) AS `t`
  LEFT JOIN `testtable` AS `t1` ON `t1`.`NAME` = :name1 
    AND `t1`.`ID` = `t`.`ID` AND `t1`.`TIME` = `t`.`time` 
  LEFT JOIN `testtable` AS `t2` ON `t2`.`NAME` = :name2
    AND `t2`.`ID` = `t`.`ID` AND `t2`.`TIME` = `t`.`time`
  ...
  LEFT JOIN `testtable` AS `tN` ON `tN`.`NAME` = :nameN
    AND `tN`.`ID` = `t`.`ID` AND `tN`.`TIME` = `t`.`time`
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы