2011-02-06 4 views
0

j'ai 2 tables dans ma base de données SQL:MySQL: Trouver les utilisateurs ayant des intérêts similaires

utilisateurs: id | email | religion | politique

Intérêts: id | user_id | interest_name

Étant donné un identifiant utilisateur1, quelle est la meilleure façon de trouver un deuxième utilisateur avec au moins 1 intérêt correspondant? Notez également que la religion/politique dans la table Utilisateurs doit également être utilisée pour cette correspondance.

Toute aide appréciée, - Andy

+0

c'est peut-être hors de votre contrôle, mais pourquoi ne pas y compris la religion et la politique dans le tableau des intérêts? En outre, les requêtes seraient légèrement plus simples de cette façon. – AJJ

+0

Hey AJweb - Je suis toujours en train d'envisager de le faire en fait. –

Répondre

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

Merci. Simple, mais difficile :) Existe-t-il un moyen simple de retourner aussi quels étaient les intérêts correspondants? –

+0

Notez que dans la deuxième et la troisième sélection, les références doivent être faites à _user_id_, pas à _id_ qui est juste un identificateur de ligne dans la table Insterests – pcofre

+0

@pcofre - c'est vrai. Merci pour l'information. –

1

(PostgreSQL)

Je ne discuterai pas avec votre décision d'élever la religion et de la politique au-dessus des intérêts ordinaires. (Cela ne signifie pas qu'il est une bonne idée,., Cela signifie simplement que je ne discuterai pas avec vous à ce sujet)

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; 

Retours

1 Walks on the beach 2 
1 Women    2 
1 Polar bears   3 

Pour correspondre aussi, par exemple, la religion, vous peut faire essentiellement la même chose avec la table "utilisateurs".

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 

Retours

1 Muslim    2 

Vous pouvez exploiter la structure similaire à apporter intérêts religieux et les intérêts ordinaires ensemble à l'aide de l'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; 

Retours

1 Walks on the beach 2 
1 Women    2 
1 Polar bears   3 
1 Muslim    2 
Questions connexes