如果可能,找到至少一个类似的标签

时间:2013-03-16 15:50:11

标签: mysql sql tagging

我的数据库中包含用户兴趣标记等表格。

用户表格如下:

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 />

我该怎么做?

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

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

1 个答案:

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