Mysql 用于筛选的SQL

Mysql 用于筛选的SQL,mysql,Mysql,通过引用,我创建了以下内容: CREATE TABLE `ub` ( `user_id` int(11) NOT NULL, `book_id` varchar(10) NOT NULL, `rate` int(11) NOT NULL, PRIMARY KEY (`user_id`,`book_id`), UNIQUE KEY `book_id` (`book_id`,`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; i

通过引用,我创建了以下内容:

CREATE TABLE `ub` (
  `user_id` int(11) NOT NULL,
  `book_id` varchar(10) NOT NULL,
  `rate` int(11) NOT NULL,
  PRIMARY KEY (`user_id`,`book_id`),
  UNIQUE KEY `book_id` (`book_id`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

insert into ub values (1, 'A', '8'), (1, 'B', '7'), (1, 'C', '10');
insert into ub values (2, 'A', '8'), (2, 'B', '7'), (2, 'C', '10'), (2,'D', '8'), (2,'X', '7');
insert into ub values (3, 'X', '10'), (3, 'Y', '8'), (3, 'C', '10'), (3,'Z', '10');
insert into ub values (4, 'W', '8'), (4, 'Q', '8'), (4, 'C', '10'), (4,'Z', '8');
然后,我可以得到下表并了解它是如何工作的

create temporary table ub_rank as 
select similar.user_id,count(*) rank
from ub target 
join ub similar on target.book_id= similar.book_id and target.user_id != similar.user_id and target.rate= similar.rate
where target.user_id = 1
group by similar.user_id;

select * from ub_rank;

+---------+------+
| user_id | rank |
+---------+------+
|       2 |    3 |
|       3 |    1 |
|       4 |    1 |
+---------+------+
然而,我开始在下面的代码之后感到困惑

select similar.rate, similar.book_id, sum(ub_rank.rank) total_rank
from ub_rank
join ub similar on ub_rank.user_id = similar.user_id 
left join ub target on target.user_id = 1 and target.book_id = similar.book_id and target.Rate= similar.Rate 
where target.book_id is null
group by similar.book_id
order by total_rank desc, rate desc;

+---------+------------+
| book_id | total_rank |
+---------+------------+
| X       |          4 |
| D       |          3 |
| Z       |          2 |
| Y       |          1 |
| Q       |          1 |
| W       |          1 |
+---------+------------+



   (1, 'A', '8'), (1, 'B', '7'), (1, 'C', '10');

   (2, 'A', '8'), (2, 'B', '7'), (2, 'C', '10'), (2,'D', '8'), (2,'X', '7');
我想做的是,假设用户1和用户2有相似的行为(之前选择了A、B、C,评级匹配),因此我将向用户A推荐D,因为它的评级更高

上面的代码似乎不这样做?如前所述,排名第一的是X。如何更改代码以实现上述目标


或者,现有的推荐方法是否更准确

现有的查询是根据每本书的总排名值对结果进行排名,然后使用比率作为总排名相同的书的平局。(此外,由于similor.rate未聚合、分组或功能上依赖于查询中的分组项,因此rate本质上是随机的。)

因此,X的排名将高于D,因为它是由一个级别为3的用户和一个级别为1的用户选择的,总排名为4,而D仅由一个级别为3的用户选择

您可以将查询更改为包含按排名加权的评级元素,例如:

select similar.book_id, 
       sum(ub_rank.rank) total_rank, 
       sum(ub_rank.rank*similar.rate) wtd_rate
from ub_rank
join ub similar on ub_rank.user_id = similar.user_id 
left join ub target on target.user_id = 1 and target.book_id = similar.book_id and target.Rate= similar.Rate 
where target.book_id is null
group by similar.book_id
order by wtd_rate desc, total_rank desc
-尽管在这种情况下,它的排名仍然会更高,因为它的排名3的用户的评分为7,加上排名1的用户的评分为10,总排名为31,而D的总排名为24

()


如果希望X的排名高于D,则需要确定将使用哪些标准将X的排名高于D。

请注意,在上一次查询中,您省略了
rate
列中的结果,而且这些结果基本上是随机的(因为<代码>相似。比率未聚合、分组或功能上依赖于分组项目)@Mark Bannister我不太熟悉,你能给我更多的提示吗?我不明白你的回答-你明白我的评论吗?对于费率栏,似乎我需要添加一些额外的条件或其他东西来让费率栏工作?是的-这取决于你希望费率栏代表什么。目前eaChBook可以有许多不同的速率值(每个用户一个),因此您现有的查询将随机返回其中一个值。