0

我有一个数据库,其中包含用户兴趣标签等表格。

用户表是这样的:

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 有 1 个相似的兴趣并回显它们,例如;

Helen 1 interest<br />
Jack 2 interests<br />

我怎样才能做到这一点?

而且,在数据库模式方面还有其他更好的方法吗?

作为一个新手,我环顾四周并尝试了不同的实现,但未能成功。

4

1 回答 1

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 索引。

于 2013-03-16T16:10:04.283 回答