MySQL, получить данные из двух связанных таблиц, если во второй таблице не всегда совпадают строки - PullRequest
2 голосов
/ 29 марта 2012

Пример содержимого таблицы

'main'
| id | total |
| 1  | 10    |
| 2  | 20    |
'timed'
| id | id_main | date_from  | date_to    | total |
| 1  | 2       | 2012-03-29 | 2012-04-29 | 50    |

Желаемый результат

| id | total |
| 1  | 10    |
| 2  | 50    |

Не совсем рабочий запрос

SELECT main.id AS id, COALESCE(timed.total, main.total) AS total
FROM main
LEFT JOIN timed
ON main.id = timed.id_main
WHERE SYSDATE() BETWEEN timed.date_from AND timed.date_to

Результат

| id | total |
| 2  | 50    |

В таблицах 'main' и 'timed' field 'total' никогда не будет NULL. В некоторых «синхронизированных» записях не будет относительного «id_main» или их будет немного, но они будут отличаться, «date_from» и «date_to» никогда не пересекаются. Таблица 'main' большая, но в 'timed' всегда будет две или три относительные записи.

CREATE TABLE `main` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `total` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT INTO `main` VALUES (1,10);
INSERT INTO `main` VALUES (2,20);
CREATE TABLE `timed` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `id_main` int(11) unsigned NOT NULL DEFAULT '0',
  `date_from` date DEFAULT NULL,
  `date_to` date DEFAULT NULL,
  `total` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`id`),
  KEY `link` (`id_main`)
) ENGINE=InnoDB;
INSERT INTO `timed` VALUES (1,2,'2012-03-29','2012-03-30',50);
ALTER TABLE `timed`
ADD CONSTRAINT `link` FOREIGN KEY (`id_main`) 
REFERENCES `main` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Извините за мой английский.

1 Ответ

1 голос
/ 29 марта 2012

Вы должны переместить условие даты в условие соединения:

SELECT main.id AS id, COALESCE(timed.total, main.total) AS total
FROM main
LEFT JOIN timed
ON main.id = timed.id_main and SYSDATE() BETWEEN timed.date_from AND timed.date_to

В вашем запросе те несоответствующие строки отфильтрованы условием WHERE, потому что timed.date_form и timed.date_to равны нулю, поэтомуsysdate не может быть между ними:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...