2014-10-17 32 views
2

我有一個表main_table,它包含輸入和輸出的記錄。從同一個表中選擇特定的sql

id | type | time    | joiner 
1 out 2014-10-15 12:00:00 1 
2 in  2014-10-15 13:00:00 1 
3 out 2014-10-15 14:00:00 1 
4 out 2014-10-15 15:00:00 1 
5 in  2014-10-15 16:00:00 1 
6 out 2014-10-15 17:00:00 1 

當我加入,其結果是:

SELECT 
    t1.id as id_out, t1.time as time_out, t2.id as id_in, t2.time as time_in 
FROM 
    (SELECT * FROM main_table WHERE type = "out") as t1 
    LEFT JOIN 
    (SELECT * FROM main_table WHERE type = "in") as t2 
    ON t1.joiner = t2.joiner AND t1.id < t2.id 
GROUP BY 
    t1.id 

id_out | time_out   | id_in | time_in    | .... 
1  2014-10-15 12:00:00 2  2014-10-15 13:00:00 
3  2014-10-15 13:00:00 5  2014-10-15 16:00:00 
4  2014-10-15 15:00:00 5  2014-10-15 16:00:00 
6  2014-10-15 17:00:00 NULL NULL 

,我需要跳過第二排,因爲記錄id = 5必須在那裏只有一次。 PS:'joiner'是必須的,因爲這裏只有一個值,但它會有更多的值。

Here is SQL for create table and insert records 

CREATE TABLE IF NOT EXISTS `main_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `type` enum('in','out') NOT NULL, 
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `joiner` int(2) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ; 

INSERT INTO `main_table` (`id`, `type`, `time`, `joiner`) VALUES 
(1, 'out', '2014-10-15 10:00:00', 1), 
(2, 'in', '2014-10-15 11:00:00', 1), 
(3, 'out', '2014-10-15 12:00:00', 1), 
(4, 'out', '2014-10-15 13:00:00', 1), 
(5, 'in', '2014-10-15 14:00:00', 1), 
(6, 'out', '2014-10-15 15:00:00', 1); 
+0

你的問題是什麼?只想要time_out和time_in具有值的行嗎? – Arion 2014-10-17 08:55:06

回答

0

需要由id_in到您的分組(這可能是直覺)更改爲分組,而不是id_out

SELECT MAX(o.time) AS time_out, 
     i.id AS id_in, 
     i.time AS time_in 
FROM main_table AS o 
     LEFT JOIN main_table AS i 
      ON i.joiner = o.joiner 
      AND i.time > o.time 
      AND i.type = 'in' 
WHERE o.type = 'out' 
GROUP BY i.id, i.time 
ORDER BY time_out; 

這給:

TIME_OUT    ID_IN TIME_IN 
2014-15-10 10:00:00  2  2014-15-10 11:00:00+0000 
2014-15-10 13:00:00  5  2014-15-10 14:00:00+0000 
2014-15-10 15:00:00  NULL NULL 

我已經使用time而不是id的連接,以防萬一您的記錄插入序列。這不幸意味着在相同的語句中獲取id_out不是確定性的。爲了得到這一點,你要麼需要做上述查詢子查詢,然後再加入回你的表:

SELECT o.id AS id_out, 
     t.time_out, 
     t.id_in, 
     t.time_in 
FROM ( SELECT MAX(o.time) AS time_out, 
        i.id AS id_in, 
        i.time AS time_in, 
        o.joiner 
      FROM main_table AS o 
        LEFT JOIN main_table AS i 
         ON i.joiner = o.joiner 
         AND i.time > o.time 
         AND i.type = 'in' 
      WHERE o.type = 'out' 
      GROUP BY i.id, i.time, o.joiner 
     ) AS t 
     INNER JOIN Main_table AS o 
      ON o.joiner = t.joiner 
      AND o.time = t.time_out 
      AND o.type = 'out'; 

,或者使用相關子查詢:

SELECT ( SELECT id 
      FROM main_table AS o2 
      WHERE o2.joiner = o.joiner 
      AND  o2.time = MAX(o.time) 
      AND  o2.type = 'out' 
      LIMIT 1 
     ) AS id_out, 
     MAX(o.time) AS time_out, 
     i.id AS id_in, 
     i.time AS time_in 
FROM main_table AS o 
     LEFT JOIN main_table AS i 
      ON i.joiner = o.joiner 
      AND i.time > o.time 
      AND i.type = 'in' 
WHERE o.type = 'out' 
GROUP BY i.id, i.time 
ORDER BY time_out; 

Examples on SQL Fiddle

相關問題