Учитывая пост X, выберите все посты Y так, чтобы ни один пользователь, который оценил их обоих, не понравился им обоим - PullRequest
3 голосов
/ 03 марта 2012

Предположим, что таблица с именем 'users', таблица с именем 'posts' и таблица с именем 'rating' содержат оценку («нравится» или «не нравится») каждого пользователя по отношению к каждому сообщению.

create table ratings (
user_id int unsigned not null,
post_id int unsigned not null,
rating set('like','dislike') not null,
primary key (user_id, post_id)
);

Учитывая пост X, я хочу выбрать все посты Y так, чтобы ни один пользователь, который оценил их обоих, не понравился им обоим. Кроме того, если возможно, я бы хотел упорядочить эти посты по количеству обычных пользователей, которые их оценили, а это означает, что пост Y с наиболее распространенными «оценщиками» с X должен появляться первым.

Я бы скопировал то, что я сделал до сих пор, но я думаю, что ничего из этого не стоит. Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

Попробуйте эту скрипку .Я не уверен на 100%, что получил то, что вы хотели, но ... проверьте с вашими данными, если они подходят.

Вы также можете удалить WHERE и добавить X.post_id AS this_post_id в FROMчтобы получить это для всех сообщений.

2 голосов
/ 03 марта 2012

Учитывая пост X, я хочу выбрать все посты Y так, чтобы ни один пользователь, который оценил их оба, не понравился им обоим.вы ожидаете 5 и 6, когда ID = 1 (я понимаю, что вы не хотите отображать ID = 1):

+---------+---------+---------+
| POST_ID | USER_ID | RATING  |
+---------+---------+---------+
|       1 |       1 | like    | // ID = 1, so remove this post
|       1 |       2 | like    |
|       1 |       3 | like    |
|       1 |       4 | dislike |
|       2 |       1 | like    | // Double like, so remove this post
|       2 |       2 | dislike |
|       2 |       3 | like    |
|       2 |       4 | dislike |
|       3 |       1 | like    | // Double like, so remove this post
|       4 |       1 | dislike |
|       4 |       2 | like    | // Double like, so remove this post
|       5 |       1 | dislike |
|       5 |       2 | dislike |
|       5 |       5 | dislike |
|       6 |       1 | dislike |
+---------+---------+---------+

Этот запрос даст вам:Если вы также хотите, чтобы они были отсортированы по общим оценщикам, выполните этот запрос:

select post_id from ratings r3
where r3.post_id not in (
  select r2.post_id from ratings r1
  join ratings r2
  on r1.post_id <> r2.post_id and r1.user_id = r2.user_id
  where (r1.post_id = 1 or r2.post_id = 1) and r1.rating = 'like' and r2.rating = 'like'
) and r3.user_id in (
  select user_id from ratings
  where post_id = 1
)
group by post_id
order by count(*) desc

Вот пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...