Как мне отфильтровать этот запрос MySQL, чтобы включить только элементы, не оцененные конкретным пользователем? - PullRequest
3 голосов
/ 02 августа 2010

Данный образец набора данных:

item
----
item_id  item_name  item_added
1        Apple      <date_time>
2        Banana     <date_time>

user
----
user_id  user_name
1        Alice
2        Bob
3        Carol

rating
------
rating_id  item_id  user_id  rating_value
1          1        1        3
2          1        2        4
3          1        3        5
4          2        1        5
5          2        2        2

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

SELECT item.*,
       COUNT(rating_value) AS rating_count
  FROM item
LEFT JOIN rating ON item.item_id = rating.item_id
 GROUP BY item_id
   HAVING rating_count = 2
 ORDER BY item_name

Как я могу изменить этот запрос, чтобы показать элементы, которые не имеют только рейтинг Кэрол? Строка rating_count не обязательна. Единственными существенными столбцами являются item_id и item_name.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 02 августа 2010
Select ...
From item 
    Left Join rating 
        On rating.item_id = item.item_id
            And rating.user_id = 3
Where rating.rating_id Is Null
Order By item.item_name 

Если вам все еще нужны рейтинговые данные, вот другая форма:

Select ...
From item 
    Left Join rating 
        On rating.item_id = item.item_id
Where Not Exists    (
                    Select 1
                    From rating As R1
                    Where R1.item_id = item.item_id
                        And R1.user_id = 3
                    )
Order By item.item_name 
1 голос
/ 02 августа 2010

При этом будут выведены только те элементы, у которых отсутствует рейтинг Кэрол (user_id = 3, который необходимо передать в качестве параметра):

SELECT item.*, COUNT(rating.rating_value) AS rating_count 
 FROM item INNER JOIN rating ON item.item_id = rating.item_id AND 
      (3 NOT IN (SELECT r.user_id FROM rating AS r 
          WHERE r.item_id = rating.item_id))
 GROUP BY item_id
 HAVING rating_count = 2   /* (2 = number of users - 1) */
 ORDER BY item_name;

Вы должны заменить все item на movie, но ваш запрос смешивает элемент и фильм, а таблица была элементом, поэтому я выполнил запрос с элементом, и я только слишком поздно увидел фильм в запросе.

...