2013-02-21 84 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上添加索引將有助於查詢的性能。