我有一个庞大的用户数据库及其详细信息。我想找到所有彼此最相似的人。 哪种方式比较适合? 直接编写SQL查询,以便他们在数据库中进行操作以检索已过滤(匹配)的记录。要么 首先在php&amp ;;中检索数组中的原始数据然后对该阵列应用比较操作? 假设我有1000个用户,我想找到最多的朋友。
UserA has {a,b,r,c,g,h,r,q,l}
UserB has {x,y,z}
UserC has {a,c,r,g,q}
.
.
.
UserN has{x,y....n}
所以我想找到与UserA最友好的用户。 比如将UserA的每个元素与整个数据库中所有用户数组的所有元素进行比较?在上述情况下,UserC应该是UserA最相似的用户。 我不知道如何做到这一点。
答案 0 :(得分:5)
假设您在表格中表示友谊:
Table: friendships
from_id | to_id
----------------------------
a | a
a | b
a | r
a | c
...etc...
b | x
b | y
b | z
...etc...
现在您可以编写一个查询来回答您的问题(在MySQL中测试):
SELECT user_id AS user_id_with_most_common_friends, MAX(cnt) AS number_of_common_friends FROM
(SELECT f2.from_id AS user_id, COUNT(*) AS cnt
FROM friendships f1
JOIN friendships f2 ON (f1.to_id = f2.to_id AND f2.from_id <> 'a')
WHERE f1.from_id = 'a'
GROUP BY f2.from_id) totals;
关于性能问题,在您的特定情况下进行经验测试将给出最可靠的答案,但对于大型数据库,我希望使用上述SQL查询比查询每一行并在PHP中计算结果要快得多,出于这些原因:
除非你的php代码有一些东西来补偿这些缺点(比如一个复杂度较低的算法,无法在SQL中表达,或者调用一些专门的C代码,例如图像处理),它通常会是更快地将工作保持在RDBMS中尽可能多。