2013-02-21 81 views
3

NULL列我有以下两个MySQL表,我需要加入:在tbl_RMySQL的左连接和右表

CREATE TABLE `tbl_L` (
    `datetime` datetime NOT NULL, 
    `value` decimal(14,8) DEFAULT NULL, 
    `series_id` int(11) NOT NULL, 
    PRIMARY KEY (`series_id`,`datetime`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `tbl_R` (
    `datetime` datetime NOT NULL, 
    `value` decimal(14,8) DEFAULT NULL, 
    `series_id` int(11) NOT NULL, 
    PRIMARY KEY (`series_id`,`datetime`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

,我需要选择全部来自tbl_L日期和价值观,但也值与tbl_L中的条目具有相同的日期时间。一个不重要的加入,就像这样:

SELECT tbl_L.datetime AS datetime, tbl_L.value AS val_L, tbl_R.value AS val_R 
FROM tbl_L 
    LEFT JOIN tbl_R 
     ON tbl_L.datetime = tbl_R.datetime 
WHERE 
    tbl_L.series_id = 1 AND tbl_R.series_id = 2 ORDER BY tbl_L.datetime ASC 

不会工作,因为它只会返回日期时间,它们都在tbl_L和tbl_R(因为右边的表,在WHERE子句中提到的)。

修改查询看起来像这样:

SELECT tbl_L.datetime AS datetime, tbl_L.value AS val_L, tbl_R.value AS val_R 
FROM tbl_L 
    LEFT JOIN tbl_R 
     ON tbl_L.datetime = tbl_R.datetime 
      AND tbl_R.series_id = 2 
      AND tbl_L.series_id = 1 
ORDER BY tbl_L.datetime ASC; 

显着减缓下来(从几毫秒到几秒钟长)。

编辑:并且也不实际工作。我会澄清我需要实现:

假设下列数据表中:

mysql> SELECT * FROM tbl_R; 
+---------------------+------------+-----------+ 
| datetime   | value  | series_id | 
+---------------------+------------+-----------+ 
| 2013-02-20 19:21:00 | 5.87000000 |   2 | 
| 2013-02-20 19:22:00 | 5.90000000 |   2 | 
| 2013-02-20 19:23:00 | 5.80000000 |   2 | 
| 2013-02-20 19:25:00 | 5.65000000 |   2 | 
+---------------------+------------+-----------+ 
4 rows in set (0.00 sec) 

mysql> SELECT * FROM tbl_L; 
+---------------------+-------------+-----------+ 
| datetime   | value  | series_id | 
+---------------------+-------------+-----------+ 
| 2013-02-20 19:21:00 | 13.16000000 |   1 | 
| 2013-02-20 19:23:00 | 13.22000000 |   1 | 
| 2013-02-20 19:24:00 | 13.14000000 |   1 | 
| 2013-02-20 19:25:00 | 13.04000000 |   1 | 
+---------------------+-------------+-----------+ 
4 rows in set (0.00 sec) 

同样,我需要的所有条目tbl_L与条目加入tbl_R匹配字词的日期时间,否则为NULL。

我的输出应该是这样的:

+---------------------+-------------+-------------+ 
| datetime   | val_L  | val_R  | 
+---------------------+-------------+-------------+ 
| 2013-02-20 19:21:00 | 13.16000000 | 5.870000000 | 
| 2013-02-20 19:23:00 | 13.22000000 | 5.800000000 | 
| 2013-02-20 19:24:00 | 13.14000000 | NULL  | 
| 2013-02-20 19:25:00 | 13.04000000 | 5.650000000 | 
+---------------------+-------------+-------------+ 

再次感谢!

+0

它适用于第二个查询? – 2013-02-21 21:43:47

+0

你需要'INNER JOIN'吗? – 2013-02-21 21:48:03

+0

为了清楚起见,每个表中主键中的es_id是什么?描述中的tbl_F是什么? – Slowcoder 2013-02-21 22:04:32

回答

4

你可以得到你想要通过移动仅tbl_R条件为加入的ON条款是这样的数据:

SELECT tbl_L.datetime AS datetime, tbl_L.value AS val_L, tbl_R.value AS val_R 
FROM tbl_L 
LEFT JOIN tbl_R 
    ON tbl_L.datetime = tbl_R.datetime 
     AND tbl_R.series_id = 2 
WHERE 
tbl_L.series_id = 1 ORDER BY tbl_L.datetime ASC 

而且,没有索引查询,以便对tbl_L使用。在tbl_L.series_id上添加索引将有助于查询的性能。