我在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(如果需要)做类似的事情?一切都有帮助!
谢谢!
答案 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
这正是预期的结果:
“插入用户”将向该查询添加另一个AND leftuser = <userid>
。