Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:寻找兴趣相似的用户_Sql_Mysql - Fatal编程技术网

MySQL:寻找兴趣相似的用户

MySQL:寻找兴趣相似的用户,sql,mysql,Sql,Mysql,我的SQL db中有两个表: 用户:id |电子邮件|宗教|政治 兴趣:id |用户id |兴趣|姓名 给定一个user1 id,找到至少有1个匹配兴趣的第二个用户的最佳方法是什么?另外,请注意,用户表中的宗教/政治也应用于此匹配 感谢您的帮助, -安迪(PostgreSQL) 我不会反对你把宗教和政治置于普通利益之上的决定。(这并不意味着这是个好主意;它只是意味着我不会就此与你争论。) 为了与宗教相匹配,您可以对表“users”执行基本相同的操作 你可以利用类似的结构,通过联盟将宗教利益和普通

我的SQL db中有两个表:

用户:id |电子邮件|宗教|政治

兴趣:id |用户id |兴趣|姓名

给定一个user1 id,找到至少有1个匹配兴趣的第二个用户的最佳方法是什么?另外,请注意,用户表中的宗教/政治也应用于此匹配

感谢您的帮助, -安迪(PostgreSQL)

我不会反对你把宗教和政治置于普通利益之上的决定。(这并不意味着这是个好主意;它只是意味着我不会就此与你争论。)

为了与宗教相匹配,您可以对表“users”执行基本相同的操作

你可以利用类似的结构,通过联盟将宗教利益和普通利益结合在一起

select t1.user_id, t1.current_religion as interest, t2.user_id
from users t1
inner join users t2 on (t1.current_religion = t2.current_religion)
where t1.user_id = 1 and t2.user_id <> 1
union
select t1.*, t2.user_id
from interests t1
inner join interests t2 on (t2.user_interest = t1.user_interest)
where t1.user_id = 1 and t2.user_id <> 1;

也许这超出了你的控制范围,但为什么不把宗教和政治列入利益表呢?而且,通过这种方式查询会稍微简单一些。嘿,AJweb-实际上我还在考虑这样做。谢谢。简单但棘手:)是否有任何简单的方法也可以返回匹配的兴趣?请注意,在第二次和第三次选择中,必须引用用户id,而不是Insterests表中的行标识符id
create table users (
user_id integer primary key,
email_addr varchar(35) not null,
current_religion varchar(35) not null default 'None',
current_politics varchar(35) not null default 'None'
);

insert into users values
(1, 'user@userdomain.com', 'Muslim', 'Liberal'),
(2, 'user@differentdomain.com', 'Muslim', 'Conservative'),
(3, 'user@yadn.com', 'Christian', 'Liberal');

create table interests (
user_id integer not null references users (user_id),
user_interest varchar(20) not null,
primary key (user_id, user_interest));

insert into interests values
(1, 'Walks on the beach'),
(1, 'Women'),
(1, 'Polar bears'),
(2, 'Walks on the beach'),
(2, 'Women'),
(2, 'Little Big Man'),
(3, 'Running on the beach'),
(3, 'Coffee'),
(3, 'Polar bears');

-- Given one user id (1), find a different user with at least 
-- one matching interest. You can do this without referring 
-- to the users table at all.

select t1.user_id, t1.user_interest, t2.user_id
from interests t1
inner join interests t2 on (t2.user_interest = t1.user_interest)
where t1.user_id = 1 and t2.user_id <> 1;
1  Walks on the beach  2
1  Women               2
1  Polar bears         3
select t1.user_id, t1.current_religion as interest, t2.user_id
from users t1
inner join users t2 on (t1.current_religion = t2.current_religion)
where t1.user_id = 1 and t2.user_id <> 1
1  Muslim             2
select t1.user_id, t1.current_religion as interest, t2.user_id
from users t1
inner join users t2 on (t1.current_religion = t2.current_religion)
where t1.user_id = 1 and t2.user_id <> 1
union
select t1.*, t2.user_id
from interests t1
inner join interests t2 on (t2.user_interest = t1.user_interest)
where t1.user_id = 1 and t2.user_id <> 1;
1  Walks on the beach   2
1  Women                2
1  Polar bears          3
1  Muslim               2