ВЫБОР двух случайных строк в таблице SQL, где значения столбца очень близки - PullRequest
0 голосов
/ 11 марта 2011

Я столкнулся с небольшой проблемой.Я создаю веб-приложение с фрагментами кода.Пользователи сталкиваются с двумя случайными фрагментами кода, которые помечены одинаково, и они должны выбрать, какой из двух им нравится больше всего, или они могут пропустить (аналогично Facemash, но с фрагментами кода вместо изображений).

Iиметь таблицу с именем CodeSnippets с этими полями:

  • Id - идентификатор фрагмента
  • Score - Оценка фрагмента
  • Некоторые другие не важные столбцы

Оценка - это действительное число.

Мой вопрос: как мне написать запрос, который получает две случайные записи с очень близкими оценками?Проблема в том, что мне нужно заказать трижды: RAND (), Score и RAND () с запасом.

Это то, что у меня уже есть:

SELECT Id, Score, Code FROM CodeSnippets ORDER BY RAND() LIMIT 2

Но это просто выбирает дваслучайные записи, даже если их результаты находятся далеко друг от друга:)

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

1 голос
/ 11 марта 2011

Можете ли вы сделать это с помощью подзапроса?Сначала сделайте запрос на самостоятельное объединение, чтобы выбрать все пары с оценкой в ​​пределах порога, затем возьмите первую случайную пару:

SELECT TOP 1 Id1, Id2
FROM (
  SELECT C1.Id AS Id1, C2.Id AS Id2 FROM CodeSnippets C1, CodeSnippet C2
  WHERE C1.Id <> C2.Id AND ABS(C1.Score-C2.Score) < [Threshold]
)
ORDER BY RAND()

Будьте осторожны, поскольку не все механизмы базы данных поддерживают подзапросы (хотя большинство должны).Большинство механизмов также оптимизируют / переписывают подзапросы для быстрой работы, но некоторые встроенные механизмы баз данных могут просто выполнить подзапрос, создать временную таблицу в памяти, а затем выполнить внешний запрос над временной таблицей, что приведет к снижению производительности.Если это ваш случай, вам нужно переписать этот запрос с помощью объединений.

...