(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