【问题标题】:MySQL: Finding users with similar interestsMySQL:寻找兴趣相似的用户
【发布时间】:2011-02-06 20:11:11
【问题描述】:

我的 SQL 数据库中有 2 个表:

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

兴趣:id |用户 ID |兴趣名称

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

任何帮助表示赞赏, - 安迪

【问题讨论】:

  • 也许这超出了您的控制范围,但为什么不在兴趣表中包括宗教和政治呢?此外,这样查询会稍微简单一些。
  • 嘿 AJweb - 实际上我仍在考虑这样做。

标签: sql mysql


【解决方案1】:
select * from users
where id in (
select id from interests where interest_name in
( select interest_name from interests where id = :current_user_id ))

【讨论】:

  • 谢谢。简单,但很棘手 :) 有没有什么简单的方法可以返回匹配的兴趣?
  • 请注意,在第二次和第三次选择中,必须对 user_id 进行引用,而不是对仅一行的 id 进行引用兴趣表中的标识符
【解决方案2】:

(PostgreSQL)

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

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

还要匹配宗教,例如,您可以对“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

返回

1  Muslim             2

您可以利用类似的结构,使用 UNION 将宗教利益和普通利益结合在一起。

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

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多