2015-01-22 2 views
0

У меня есть интересный вопрос: Предположения: Я использую Spring и Hibernate для базы данных Postgres.Как выбрать десять значений, пять больше и пять меньше заданного значения в одном запросе Postgre?

У меня есть таблица пользователей, и у каждого пользователя есть свое имя, и это оценка. Я хочу создать своего рода рангом, где: Учитывая имя пользователя я экстраполировать 5 пользователей, которые имеют больше очков, чем данный пользователь и 5 пользователей, которые имеют меньше очков, как это:

  • user1 с.105
  • пользователь2 с.104
  • user3 с.103
  • user4 с.102
  • данный пользователь стр.100
  • user6 с.99
  • user7 стр.98
  • ...

Мой вопрос: можно ли это сделать только в одном запросе? Будет ли он более оптимальным и быстрым в одном запросе? Есть ли у вас предложения такого запроса? Выполнение этого в двух запросах очень просто, но я хочу знать, есть ли способ сделать это за один раз?

+0

Используйте свои 2 запроса с помощью 'UNION' –

+0

Насколько я знаю, запрос на поддержку соединения с поддержкой спящего режима. [link] (https://hibernate.atlassian.net/browse/HHH-1050) – gaia

ответ

2

PostgreSQL может сделать это с помощью одного запроса. Возможно, вам придется использовать собственный (raw) SQL в Hibernate. Вот один из способов.

with lowers as (
    select * 
    from test 
    where score < (select score from test where user_id = 13) 
    limit 5 
), highers as (
    select * 
    from test 
    where score > (select score from test where user_id = 13) 
    limit 5 
) 
select * from lowers 
union all 
select * from highers 
union all 
select * from test where user_id = 13 
order by score; 

Вы должны думать о том, что должно произойти, если не пять баллов больше или пять баллов меньше, чем цель (user_id = 13). Кроме того, этот запрос не будет приводить ни в какие строки, которые имеют оценки, идентичные цели, что может быть или не быть тем, что вы ищете. Он также не пытается получить 10 строк, которые ближе всего к цели.

В моем ящике dev, который не является speedster, этот запрос работает в 0,1 мс на таблице в миллион строк.

+0

Привет, Майк, большое спасибо за ваш намек, я не знал, что «с» близко, поэтому я должен его изучить. Я также должен рассмотреть все упомянутые вами вопросы, чтобы мы увидели. Я дам вам знать, если я получу что-то разумное :) – gaia

Смежные вопросы