2011-02-06 49 views
0

我有我的SQL數據庫2個表:MySQL的:查找用戶有相同興趣的

用戶:ID |電子郵件|宗教|政治

興趣愛好:id | user_id | interest_name

給定一個user1 id,找到至少有一個匹配興趣的第二個用戶的最佳方法是什麼?此外,請注意,Users表中的宗教/政治也應該用於此次比賽。

任何幫助表示讚賞, 安迪 -

+0

也許這是你無法控制的,但爲什麼不包括在利益表格宗教和政治?而且,這種查詢會稍微簡單一些。 – AJJ

+0

嘿AJweb - 我仍然在考慮這樣做。 –

回答

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)) 
+0

謝謝。簡單但棘手:)有什麼簡單的方法可以返回匹配的興趣是什麼? –

+0

請注意,在第二個和第三個選擇中,必須對_user_id_進行引用,而不是_id_,這只是在Insterest表 – pcofre

+0

@pcofre中的一個行標識符 - 這是正確的。感謝您的高舉。 –

1

(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, '[email protected]', 'Muslim', 'Liberal'), 
(2, '[email protected]', 'Muslim', 'Conservative'), 
(3, '[email protected]', '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 

您可以利用類似的結構,使宗教利益與普通利益一起使用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