SQL - находит следующие и предыдущие строки, учитывая конкретный оператор Where

x не может быть прокси-сервером самого себя

Конечно, это возможно. Вы можете изменить переменную так, чтобы она указывала на прокси, просто выполнив

x = new Proxy(x, handler)

Пример примитива:

const handler = {
  set: function(obj, prop, value) {
    console.log('setting prop: ', prop, ' to ', value)
    obj[prop] = value;
    return true;
  }
};

let x = { 'a': 1, 'b': 2 };

x = new Proxy(x, handler);

x.a = 3; // the method is automatically called
[ 117]
9
задан bobbyh 14 March 2009 в 00:59
поделиться

4 ответа

Следующий:

SELECT * FROM `bb_topics` 
      WHERE `topic_id` = 
      (select min(`topic_id`) FROM `bb_topics` where `topic_id` > 123
         and `topic_poster` = 5)

Предыдущий:

SELECT * FROM `bb_topics` 
      WHERE `topic_id` = 
      (select max(`topic_id`) FROM `bb_topics` where `topic_id` < 123
         and `topic_poster` = 5)

Оба:

SELECT * FROM `bb_topics` 
      WHERE `topic_id` = 
      (select min(`topic_id`) FROM `bb_topics` where `topic_id` > 123
                     and `topic_poster` = 5)
      or `topic_id` = 
      (select max(`topic_id`) FROM `bb_topics` where `topic_id` < 123
                        and `topic_poster` = 5)
14
ответ дан 4 December 2019 в 13:05
поделиться

Посмотрите на этот более старый вопрос также.

Мое предположение - то, что ОБЪЕДИНЕНИЕ с ПРЕДЕЛОМ 1 работает лучше, чем агрегаты в моем ответе здесь.

2
ответ дан 4 December 2019 в 13:05
поделиться

Вот тонкий, но эффективный способ выполнить это, и он работает даже над старыми версиями MySQL, которые не поддерживают подзапросы-

SELECT *    
FROM bb_topics AS bb1    
LEFT JOIN bb_topics AS bb2    
    ON bb1.topic_poster = bb2.topic_poster    
    AND bb2.topic_id > bb1.topic_id    
LEFT JOIN bb_topics AS bb3  
    ON bb1.topic_poster = bb3.topic_poster    
    AND bb3.topic_id > bb1.topic_id    
    AND bb3.topic_id < bb2.topic_id  
WHERE bb1.topic_poster = 5  
    AND bb3.topic_id IS NULL  

Это получает Вас следующее смежное сообщение. Я могу заполнить симметричные пункты для следующего предыдущего сообщения, если это не самоочевидно.

РЕДАКТИРОВАНИЕ - незначительный исправило alii.

0
ответ дан 4 December 2019 в 13:05
поделиться

Примечание: Прежде downvoting, прочитайте комментарий и первый пересмотр вопроса ;-)

По определению данные по таблице RDBMS не заказаны. Это означает, что при выполнении запроса если Вы не указываете пункт ORDER BY, порядок может отличаться от одного запроса до другого. Кроме того, необходимо полагать, что следующий запрос идет в (или, по крайней мере, может) возвращать другой порядок.

Предположим, что это может быть другим пользователем на базе данных, вставляет новую запись, и RDBMS рассматривает для помещения ее между строками, которые Вы рассматриваете. Или DBA перемещает таблицу к другому в основании онлайн (это возможно в Oracle, например), в этом случае данные могут быть изменены по любому вопросу.

Для Вашего вопроса необходимо создать своего рода кэш результата запроса для определения предшествующих и следующих строк на запросах.

0
ответ дан 4 December 2019 в 13:05
поделиться
Другие вопросы по тегам:

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