MySQL偏好查找器

时间:2016-05-30 16:27:41

标签: php mysql

我在MySQL数据库中有很多用户首选项。例如,

User 2 - Preference 1 - yes
User 3 - Preference 3 - no
User 2 - Preference 3 - no
User 6 - Preference 2 - yes
User 3 - Preference 1 - no

基本上,我正在尝试设计一个能够插入用户的查询,它会找到具有类似偏好的用户。例如,插入"用户2"在上面,它将返回"用户3"因为他们不喜欢#3。查询应该在所有首选项中找到多个类似的用户和因子。

我如何使用MySQL和PHP(如果需要)做类似的事情?一切都有帮助!

谢谢!

1 个答案:

答案 0 :(得分:0)

为了简单起见,我已经定义了一个简单的表,类似于你在问题中描述的那样,如下所示:

CREATE TABLE pref (
  user integer not null,
  pref integer not null,
  value bool default false,
  primary key (user, pref)
);

此外,我添加了以下示例数据:

INSERT INTO pref VALUES
(2, 1, true), (3, 3, false), (2, 3, false), 
(6, 2, true), (3, 1, false);

“类似偏好”的基本思想是基于self-join的概念,即将偏好DB表与自身连接起来。在玩完它之后,我很快找到了以下SELECT声明:

SELECT leftpref.user as leftuser, rightpref.user as rightuser, count(*) as score from pref leftpref 
INNER JOIN pref rightpref on leftpref.pref = rightpref.pref and leftpref.value = rightpref.value
WHERE leftpref.user <> rightpref.user
GROUP BY leftpref.user, rightpref.user
;

这将产生以下结果:

leftuser rightuser score
2        3         1
3        2         1

这正是预期的结果:

  • 用户2与用户3共享一个首选项
  • 第二行是用户3与用户2共享首选项的对称语句。
  • 两个用户分享的偏好越多,得分就越高

“插入用户”将向该查询添加另一个AND leftuser = <userid>