sql получение по запросу строки для следующей или предыдущей строки текущей строки

ДА.

существует все еще несколько логинов. Я должен пойти и войти в систему своего поставщика OpenID тогда, я должен перейти к сайту и войти в систему снова с OpenID URL. Нет хочет сделать, больше работы и OpenID являются намного большим количеством работы.

я не знаю ни о ком, кто не находится в вычислительной технике, которая использует OpenID. OpenID все еще просто слишком сложен. Средний пользователь не должен быть смущен другим слоем абстракции.

существует также проблема отслеживания, куда пользователи OpenID идут. Я использую VeriSign, доверяемое имя, но что относительно тех, кто использует меньше защищенных поставщиков. Нет, я не собираюсь называть имена и запускать войну пламени.

существует лучший ответ, это называют RoboForm (или одна из многих копий). Все пользовательские пароли и имена сохранены на их машине, и шифруется. Это просто в использовании, более безопасно, и БЫСТРЕЕ.

12
задан alex 21 August 2012 в 08:53
поделиться

4 ответа

Это то, что я использую для поиска предыдущих / следующих записей. Любой столбец в вашей таблице может использоваться в качестве столбца сортировки, и никаких объединений или неприятных действий не требуется:

Следующая запись (дата больше текущей записи):

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;

Предыдущая запись (дата меньше текущей записи):

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;

Пример:

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 |
+------+---------------+---------------------+
17
ответ дан 2 December 2019 в 07:03
поделиться

Я понимаю, что вы используете MySQL, но только для справки, вот как это можно сделать с помощью аналитических функций Oracle LEAD и LAG:

select empno, ename, job,
  lag(ename, 1) over (order by ename) as the_guy_above_me,
  lead(ename, 2) over (order by ename) as the_guy_two_rows_below_me
from emp
order by ename

Думаю, есть причина, по которой Oracle стоит денег, а MySQL - бесплатен ...: -)

На этой странице показано , как эмулировать аналитические функции в MySQL .

2
ответ дан 2 December 2019 в 07:03
поделиться

Ужасный хакер - мне это не нравится, но может сработать ..

with yourresult as
(
select id, photo_title, created_date, ROW_NUMBER() over(order by created_date) as 'RowNum' from your_table
)
-- Previous
select * from yourresult where RowNum = ((select RowNum from yourresult where id = '32kJ') -1)
-- Next
select * from yourresult where RowNum = ((select RowNum from yourresult where id = '32kJ') +1)

Какой толк?

0
ответ дан 2 December 2019 в 07:03
поделиться

Вы хотели следующую / предыдущую строку по дате? Если это так, вы можете сделать это:

select MyTable.*
from MyTable
join
  (select id
   from MyTable
   where created_date < (select created_date from MyTable where id = '32kJ')
   order by created_date desc, id desc
   limit 1
  ) LimitedTable on LimitedTable.id = MyTable.fund_id;
2
ответ дан 2 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: