这次是关于左连接的。这些是表定义:
CREATE TABLE `tb_workday` (
`id` int(11) DEFAULT NULL,
`wddate` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
tb_workday内容示例:
+----+------------+
| id | wddate |
+----+------------+
| 1 | 2016-06-01 |
| 2 | 2016-06-02 |
| 3 | 2016-06-03 |
| 4 | 2016-06-04 |
| 5 | 2016-06-05 |
和tb_time
CREATE TABLE `tb_t` (
`TBegDate` date NOT NULL,
`TBegTime` time DEFAULT NULL,
PRIMARY KEY (`TBegDate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
tb_time内容示例:
+------------+----------+
| TBegDate | TBegTime |
+------------+----------+
| 2016-01-01 | 19:00:33 |
| 2016-01-02 | 22:23:33 |
| 2016-01-03 | 17:43:33 |
| 2016-01-04 | 00:02:33 |
| 2016-01-05 | 19:00:33 |
| 2016-01-06 | 06:28:33 |
| 2016-01-07 | 03:41:33 |
| 2016-01-08 | 11:24:33 |
这是我想要的结果。我希望该表显示wddate和wddate + 1的tb_time结果:
+----+------------+------------+----------+
| id | wddate | TBegDate | TBegTime |
+----+------------+------------+----------+
| 1 | 2016-06-01 | 2016-06-01 | 23:51:33 |
| 1 | 2016-06-01 | 2016-06-02 | 18:40:33 |
| 2 | 2016-06-02 | 2016-06-02 | 18:40:33 |
| 2 | 2016-06-02 | 2016-06-03 | 11:45:33 |
| 3 | 2016-06-03 | 2016-06-03 | 11:45:33 |
| 3 | 2016-06-03 | 2016-06-04 | 20:01:33 |
| 4 | 2016-06-04 | 2016-06-04 | 20:01:33 |
| 4 | 2016-06-04 | 2016-06-05 | 06:24:33 |
我正在使用此查询
SELECT * FROM tb_workday
LEFT JOIN tb_time ON TBegDate IN (WDDate,DATE_ADD(WDDate,INTERVAL 1 DAY))
但是tb_time的EXPLAIN结果是183行,根本不使用索引。
现在我将其更改为确切的日期
SELECT * FROM tb_wd
LEFT JOIN tb_t ON TBegDate IN ("2016-01-01","2016-01-02")
这次EXPLAIN结果是2行。
我希望前一个查询使用索引。请回答这个问题而不要进入UNION查询。我之前问过这个问题(How to make multiple LEFT JOINs with OR fully use a composite index? (part 2)),但由于我的英语,我没有表达我的问题,所以我在这里做得更简单。我想同时使用IN子句和索引。