2014-05-25 3 views
0

У меня есть следующие таблицыSQL: Получение неявных оценок в виде списка пользователя элемента

  • стол пользователя user с id полем
  • таблицу элементов item, а также с полем идентификатора
  • таблицу positiverating с полями customerid и itemid, у которых есть запись, если пользователь дал неявный положительный рейтинг для товара (например, видел/купил/нажал/... он)

Я хочу, чтобы выбрать поля user.id, item.id и rating (логическое поле), что для каждого пользователя и каждый элемент rating является true IIF существует запись в таблице positiverating и в противном случае false?

Некоторые мысли:

  • SELECT user.id, item.id from user, item Результаты в поперечном продукте необходимого.
  • positiveratings более или менее такой продукт креста, но только для номинальных элементов

Предполагая, что есть 100000 пунктов и такое же количество пользователей, результирующий запрос должен быть достаточно эффективно. Я подозреваю, что нужны левые/правые соединения, но я чувствую себя немного застрявшим.

Чтобы быть более конкретным, мне нужен запрос для PostgreSQL.

ответ

1

Вы хотите что-то ищите?

select u.userid, i.itemid, (pr.itemid is not null) 
from user u cross join 
    item i left outer join 
    positiverating pr 
    on pr.userid = u.userid and pr.itemid = i.itemid; 

Это не принимает на себя никаких комбинаций дубликатов пользователя/записи в positiverating таблицы.

Если у вас есть дубликаты в positiverating, вы можете использовать group by. Однако я бы рекомендовал вместо этого использовать exists. Я думаю, что будет работать следующее:

select u.userid, i.itemid, 
     exists (select 1 from postivierating where pr.userid = u.userid and pr.itemid = i.itemid) 
from user u cross join 
    item i; 
+0

Выглядит отлично. Что делать, если в позиционировании есть дубликаты? Пользователь может посещать/покупать товар более одного раза. Может, считать это? – user3001

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