sql pulling a row for next or previous row of a current row

后端 未结 6 1567
抹茶落季
抹茶落季 2020-12-03 05:51
id    |  photo title     |  created_date

XEi43 |  my family       |  2009 08 04
dDls  |  friends group   |  2009 08 05
32kJ  |  beautiful place |  2009 08 06
EOIk  |  wo         


        
6条回答
  •  暖寄归人
    2020-12-03 06:27

    This is what I use for finding previous/next records. Any column in your table can be used as the sort column, and no joins or nasty hacks are required:

    Next record (date greater than current record):

    SELECT id, title, MIN(created) AS created_date
    FROM photo
    WHERE created >
      (SELECT created FROM photo WHERE id = '32kJ')
    GROUP BY created
    ORDER BY created ASC
    LIMIT 1;
    

    Previous record (date less than current record):

    SELECT id, title, MAX(created) AS created_date
    FROM photo
    WHERE created <
      (SELECT created FROM photo WHERE id = '32kJ')
    GROUP BY created
    ORDER BY created DESC
    LIMIT 1;
    

    Example:

    CREATE TABLE `photo` (
        `id` VARCHAR(5) NOT NULL,
        `title` VARCHAR(255) NOT NULL,
        `created` DATETIME NOT NULL,
        INDEX `created` (`created` ASC),
        PRIMARY KEY (`id`)
    )
    ENGINE = InnoDB;
    
    INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('XEi43', 'my family',       '2009-08-04');
    INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('dDls',  'friends group',   '2009-08-05');
    INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('32kJ',  'beautiful place', '2009-08-06');
    INSERT INTO `photo` (`id`, `title`, `created`) VALUES ('EOIk',  'working late',    '2009-08-07');
    
    SELECT * FROM photo ORDER BY created;
    +-------+-----------------+---------------------+
    | id    | title           | created             |
    +-------+-----------------+---------------------+
    | XEi43 | my family       | 2009-08-04 00:00:00 |
    | dDls  | friends group   | 2009-08-05 00:00:00 |
    | 32kJ  | beautiful place | 2009-08-06 00:00:00 |
    | EOIk  | working late    | 2009-08-07 00:00:00 |
    +-------+-----------------+---------------------+
    
    
    SELECT id, title, MIN(created) AS next_date
    FROM photo
    WHERE created >
      (SELECT created FROM photo WHERE id = '32kJ')
    GROUP BY created
    ORDER BY created ASC
    LIMIT 1;
    
    +------+--------------+---------------------+
    | id   | title        | next_date           |
    +------+--------------+---------------------+
    | EOIk | working late | 2009-08-07 00:00:00 |
    +------+--------------+---------------------+
    
    SELECT id, title, MAX(created) AS prev_date
    FROM photo
    WHERE created <
      (SELECT created FROM photo WHERE id = '32kJ')
    GROUP BY created
    ORDER BY created DESC
    LIMIT 1;
    
    +------+---------------+---------------------+
    | id   | title         | prev_date           |
    +------+---------------+---------------------+
    | dDls | friends group | 2009-08-05 00:00:00 |
    +------+---------------+---------------------+
    

提交回复
热议问题