我的数据库中包含用户,兴趣和标记等表格。
用户表格如下:
user_id | name | city
15 John New York
18 Helen Virgina
兴趣表格如下:
interest_id | user_id | tag_id
1 15 23
2 15 24
3 15 25
4 18 23
5 18 27
标签表格如下:
tag_id | description
23 Skiing
24 TV
25 Movies
26 Music
27 Seinfeld
表格说约翰和海伦都对滑雪感兴趣。
我想做一个sql查询,这将由于John和Helen有一个类似的兴趣并回应它们,如;
Helen 1 interest<br />
Jack 2 interests<br />
我该怎么做?
而且,在数据库模式方面还有其他更好的方法吗?
作为一个新手,我环顾四周,尝试了不同的实施,但未能成功。
答案 0 :(得分:2)
计算用户与其他人的共同利益:
SELECT u2.name, count(*)
FROM interests AS i1
JOIN users AS u1
ON u1.user_id = i1.user_id
JOIN interests AS i2
ON i1.tag_id = i2.tag_id
JOIN users AS u2
ON u2.user_id = i2.user_id
AND u1.user_id <> u2.user_id
JOIN tags AS t
ON i1.tag_id = t.tag_id
WHERE u1.name = 'John'
GROUP BY u2.name;
http://sqlfiddle.com/#!2/80aad/1
对于模式,如果将其命名为users_tags,那么联结表会更有意义。此模式中不需要兴趣的id列,组合(user_id,tag_id)是主键的自然候选者,无论如何你都需要在其上放置UNIQUE索引。