示例表内容

'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”“total”中,字段永远不会为空。
在某些“定时”记录中,不会有相对的“id_main”,或者很少有,但它们会有所不同,“date_from”“date_to”“never intersect”。
表“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;

对不起我的英语。

最佳答案

您应该在联接条件中移动日期条件:

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

在查询中,由于timed.date_form和timed.date_to为空,因此不匹配的行将由WHERE条件筛选出来,因此sysdate不能介于两者之间:)

关于mysql - MySQL,如果第二个表并非总是具有匹配的行,则从两个相关的表中获取数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9924373/

10-12 03:10