Mysql 给定一个帖子X,选择所有帖子Y,这样就不会有给它们都打分的用户同时喜欢这两个帖子

Mysql 给定一个帖子X,选择所有帖子Y,这样就不会有给它们都打分的用户同时喜欢这两个帖子,mysql,sql,Mysql,Sql,假设有一个名为“users”的表、一个名为“posts”的表和一个名为“ratings”的表,其中包含每个用户对每个post的“like”或“厌恶”评级 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,我想选择所有

假设有一个名为“users”的表、一个名为“posts”的表和一个名为“ratings”的表,其中包含每个用户对每个post的“like”或“厌恶”评级

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,这样就不会有给它们都打分的用户同时喜欢它们了。此外,如果可能的话,我想按照给这些帖子打分的普通用户的数量来排序,这意味着最常见的“打分者”为X的帖子Y应该首先出现

我想复制我到目前为止所做的,但我认为这些都不值得。感谢您的帮助,谢谢

试试看。我不是100%确定我得到了你想要的,但是。。。检查您自己的数据是否合适

您还可以删除WHERE并将X.post\u id作为此post\u id添加到FROM中,以便为所有帖子获取此信息

给定一个帖子X,我想选择所有帖子Y,这样就不会有给它们都打分的用户同时喜欢它们了

好的,那么给定以下一组数据,当ID=1时,您期望5和6,我知道您也不希望显示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 distinct 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'
)
如果您还希望按照两个评分员的共同评分对它们进行排序,请运行以下查询:

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

这是一个

我不应该这么晚才问这个问题,我现在需要睡觉,但我一起床就会试试你的想法,让你知道,它看起来很棒。谢谢将错过r2=喜欢和r1=不喜欢以及两者都是不喜欢的情况。此外,您不需要检查r1.user_id r2.user_id,因为作为主键,它们将解析为同一行;而且一排不能同时是喜欢和不喜欢。老实说,我没有得到你的评论。对于不同的用户,每一行都将被遍历并与所有其他行进行比较,因此不会出现任何遗漏。我同意你提出的额外条件,但实际上,相互比较用户ID要比相互比较评分更快。您能否提供一组数据,其中此查询提供了错误的答案?我没有注意到您查找了所有行。OP的请求给出了一个post X,所以您需要在您的案例中收集r1和r2,因为它们不是对称的。无论如何,在前面的评论中有一个不好的例子:答案中应该有一个用户将r1和r2评为不喜欢,但你不允许。因为前面的答案有效,我没有测试你的答案,但它看起来还行,我采取了你的按计数排序的策略,而不是像另一个答案那样用别名选择计数,所以一个当之无愧的+1,谢谢!