php - 当用于匹配的数据存储在3个不同的表中时,如何找到彼此匹配的用户

标签 php mysql

第一次在这里提问

所以基本上我有3个表,一个存储客户基本数据,一个存储基于问题的用户属性,另一个存储用户偏好,其中存储相同属性的多个选项。

可以说...

表用户:

userid, username, useremail, userphone

表属性:

attributeid,attributeofuser, attributename(number), attribute value(number)

表首选项:

preffid, preffofuser, preffattributename(number), preffattributevalue(number)

属性名称和属性值是存储在另一个表中的属性和值的 id 数字。

如果 preffattributevalue 为 0 则表示无关紧要,因此任何属性都可以

所以我需要的是根据特定用户的属性找到与特定用户的偏好相匹配的所有用户,并按百分比进行查找,因此不仅 100% 匹配,而且匹配率也较低。

我已经完成了看起来非常繁重的查询循环,并正在寻找更好的选择。提前致谢

最佳答案

正如 Marty McVry 所说,这是一个有趣的查询。这是我的解决方案。请注意,我冒昧地对您的表格进行了一些重命名...

架构:

CREATE TABLE user (id int, username varchar(200), info varchar(200));
CREATE TABLE attr (id int, user_id int, a_name varchar(200), a_value varchar(200));
CREATE TABLE pref (id int, user_id int, pa_name varchar(200), pa_value varchar(200));

查询:

SELECT looker.username AS looker_name, 
    CONCAT("likes ",match_candidate.username,"\'s") AS candidate_name, 
    GROUP_CONCAT(" ", CONCAT(attr.a_value," ", attr.a_name)) AS attributes,
    COUNT(attr.a_name) AS match_count
FROM pref 
  INNER JOIN attr ON attr.a_name = pref.pa_name 
  INNER JOIN user AS match_candidate ON match_candidate.id = attr.user_id
  INNER JOIN user AS looker ON looker.id = pref.user_id
WHERE (pref.pa_value IS NULL OR pref.pa_value = attr.a_value) AND
  pref.user_id = 101 AND looker.id <> match_candidate.id
GROUP BY candidate_name
ORDER BY match_count DESC;

说明:

我们获取 pref 表并将其与 attr 表连接以获得匹配的属性名称。 attr 表可以与 user 表连接来获取候选人的姓名。最后,我们可以与“观看者”建立联系,即希望他/她的偏好匹配的用户。这是通过与用户表的第二次连接来完成的,但这一次当然是在 pref.user_id 上。 现在我们需要整理出不匹配的属性值。为此,我们强制所有结果行都将 NULL 作为首选属性值,或者该属性值等于匹配候选者的属性值(属性名称已通过连接条件匹配)。要获取特定“查看者”的匹配候选者,我们还必须将其包含在 WHERE 子句中 (pref.user_id = 101)。这里 101 只是一个用户 ID 的示例。最后,我们必须确保我们不会将观看者与他/她自己相匹配(以防自己的偏好与自己的属性相匹配)。 SELECT 字段只是使用 GROUP_CONCATCONCAT 为了组合匹配的属性,我们使用GROUP BY

我做了一个sqlfiddle一起玩。因此,在我的示例中,我使用字符串作为属性名称和值。 pref 值中的 NULL 表示没有偏好,表示候选的所有属性值都匹配。

旁注:您可以对 attr 和 pref 使用相同的表,并添加定义其类型的字段。

更新旁注:我现在更新了这个答案很多。如果您查看了早期版本的 fiddle ,请再次点击该链接,因为它可能已更改。

关于php - 当用于匹配的数据存储在3个不同的表中时,如何找到彼此匹配的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16261126/

相关文章:

php - Gmail 将我的电子邮件视为网络钓鱼?

php - 一切都出了问题 : Php - MySQL

mysql - HTML : from select list need to add value to mysql

php - 我应该使用哪个索引来混合 WHERE 和 ORDER BY

php - 照片上传在本地主机上工作但在服务器上不起作用?

mysql - 尝试按小时对查询进行分组

php - 如何在mysql中求和不同的值

php - 我的登录 PHP 表单不起作用。我相信我的 $hash = $row ['password' ];是问题所在,但我不太确定

javascript - PHP 和 MYSQL 系统(加上 HTML,CSS&JS)

php - 如何使用 PHP imagecopy() 或 imagecopymerge() 组合/合并两个图像?