按MySQL的相似性对用户排序

时间:2014-08-02 19:46:54

标签: mysql

在MYSQL中,我有一个用户表,一个项目表和一个投票表,投票表具有用户给予项目的投票。并非每个用户都对所有项目进行了投票,投票可以是1或-1。

鉴于用户,是否可以按投票的相似性对用户进行排序?

User Table        Item Table       Vote Table

Id | Username     Id | Item        Id | UserId | ItemId | Vote
-------------     ------------     ---------------------------
1  | Tom          1  | Apple       1  | 1      | 1      | -1
2  | Jenny        2  | Orange      2  | 1      | 2      | 1
3  | Jim          3  | Grape       3  | 1      | 4      | 1
                  4  | Lemon
                                   4  | 2      | 2      | 1  (Jenny voted the same as Tom)
                                   5  | 2      | 4      | -1

                                   6  | 3      | 1      | -1 (Jim voted the same as Tom)
                                   7  | 3      | 2      | -1
                                   8  | 3      | 4      | 1  (Jim voted the same as Tom)

在这种情况下,给定用户ID 1(Tom),用户ID 3(Jim)更像Tom,因为他们在itemid 1(Apple)和itemid 4(Lemon)上投票两次。用户ID 2(Jenny)不那么相似,因为他们只对itemid 2(橙色)投了一次。

换句话说,吉姆与汤姆更相似,因为他与汤姆的投票方式与汤姆的投票方式相同,而詹姆则不那么相似,因为她在一件商品上的投票方式与汤姆相同。

1 个答案:

答案 0 :(得分:0)

我想我找到了一个解决方案:

SELECT all_users.userId, all_users.itemId, COUNT(user.userId) AS total_matches
FROM votes AS user
JOIN votes AS all_users
    ON all_users.vote = user.vote
    AND all_users.itemId = user.itemId
    AND all_users.userId != user.userId
    AND user.userId = 1
GROUP BY all_users.userId
ORDER BY total_matches DESC