从同一表中选择特定的SQL

朱拉·库巴拉(Juraj Kubala)

我有一张表main_table,其中包含输入和输出的记录。

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);
加雷斯

您需要更改分组(这可能很直观),以分组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;

SQL小提琴上的示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Multiple从同一表中选择

来自分类Dev

SQL:从同一表中选择列

来自分类Dev

MySQL在同一表中选择

来自分类Dev

删除从同一表的选择查询中选择的记录

来自分类Dev

删除从同一表的选择查询中选择的记录

来自分类Dev

MySQL查询在同一表中选择

来自分类Dev

从同一表,不同行,不同列中选择

来自分类Dev

从同一表中选择条件不同的字段

来自分类Dev

如何基于[ParentId]从同一表中选择[ParentName]

来自分类Dev

从同一表中选择不匹配的数据

来自分类Dev

从同一表中选择多个值

来自分类Dev

MySQL从同一表中选择对多行分组

来自分类Dev

SQL Server:如何使用if else语句从同一表中选择不同的数据

来自分类Dev

SQL从同一表中选择两个最大行,并与第三个表连接

来自分类Dev

SQL从同一表中选择两个最大行,并与第三个表联接

来自分类Dev

SQL使用一个表中的行数据从另一表中的特定列中选择数据

来自分类Dev

SQL选择同一表上的多个条件

来自分类Dev

SQL选择联合同一表

来自分类Dev

如何从联接到同一表的数据表中选择?

来自分类Dev

如何从表中选择复杂数据并将其从同一表中删除

来自分类Dev

如何从联接到同一表的数据表中选择?

来自分类Dev

MySQL更新表并在子查询中从同一表中选择

来自分类Dev

如何从表中选择具有同一表属性唯一值的记录?请回答有关oracle sql plus的问题

来自分类Dev

提供子行时,从同一表中选择父行

来自分类Dev

如何使用if语句从同一表中选择和合并值

来自分类Dev

在单个JOIN中从同一表中选择不同的用户

来自分类Dev

从同一表中的新旧列表中选择“与众不同”

来自分类Dev

SQL查询从一个表中选择不在另一表中的行

来自分类Dev

SQL在同一表上的关系

Related 相关文章

  1. 1

    SQL Multiple从同一表中选择

  2. 2

    SQL:从同一表中选择列

  3. 3

    MySQL在同一表中选择

  4. 4

    删除从同一表的选择查询中选择的记录

  5. 5

    删除从同一表的选择查询中选择的记录

  6. 6

    MySQL查询在同一表中选择

  7. 7

    从同一表,不同行,不同列中选择

  8. 8

    从同一表中选择条件不同的字段

  9. 9

    如何基于[ParentId]从同一表中选择[ParentName]

  10. 10

    从同一表中选择不匹配的数据

  11. 11

    从同一表中选择多个值

  12. 12

    MySQL从同一表中选择对多行分组

  13. 13

    SQL Server:如何使用if else语句从同一表中选择不同的数据

  14. 14

    SQL从同一表中选择两个最大行,并与第三个表连接

  15. 15

    SQL从同一表中选择两个最大行,并与第三个表联接

  16. 16

    SQL使用一个表中的行数据从另一表中的特定列中选择数据

  17. 17

    SQL选择同一表上的多个条件

  18. 18

    SQL选择联合同一表

  19. 19

    如何从联接到同一表的数据表中选择?

  20. 20

    如何从表中选择复杂数据并将其从同一表中删除

  21. 21

    如何从联接到同一表的数据表中选择?

  22. 22

    MySQL更新表并在子查询中从同一表中选择

  23. 23

    如何从表中选择具有同一表属性唯一值的记录?请回答有关oracle sql plus的问题

  24. 24

    提供子行时,从同一表中选择父行

  25. 25

    如何使用if语句从同一表中选择和合并值

  26. 26

    在单个JOIN中从同一表中选择不同的用户

  27. 27

    从同一表中的新旧列表中选择“与众不同”

  28. 28

    SQL查询从一个表中选择不在另一表中的行

  29. 29

    SQL在同一表上的关系

热门标签

归档