Сложный запрос к базе данных распределения результатов - PullRequest
2 голосов
/ 17 февраля 2012

В моей базе данных хранятся предпочтения моих пользователей о том, какой процент музыки им нравится. Таким образом, пользователь Билли имеет следующие предпочтения

id:1 user:Billy music_type:Jazz percentage:50%
id:2 user:Billy music_type:Punk percentage:25%
id:3 user:Billy music_type:Folk percentage:25%

У меня также есть стол, в котором 1 миллион джазовых, панк и фолк треков

id:1 music_type:Jazz track_name:Bippity Boop
id:2 music_type:Punk track_name:Grrrrrrrrrr!
id:3 music_type:Folk track_name:DeDiDoDeeDoo

Я хочу показать Билли 100 треков. 50 из них Jazz, 25 Punk, 25 Folk (согласно его предпочтениям, хранящимся в первой таблице).

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

1 Ответ

3 голосов
/ 17 февраля 2012

В Postgresql 8.4 или выше вы можете использовать оконную функцию для разделения дорожек по типу музыки, получить счетчик на раздел, а затем использовать его для ограничения результатов на раздел в соответствии с предпочтениями.Вот скелет SQL:

  select s.track_name,s.id from
   (select id, track_name, music_type, row_number() over (partition by music_type) as r
      from tracks ) s,
    preferences p
    where username='Billy'
    and p.music_type=s.music_type
    and s.r<=p.percentage
    order by s.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...