以下查询根据总分差异将userID与彼此匹配。我有两张桌子,调查&用户。
我需要将其加入到我拥有用户名/照片链接的用户表中。
我需要显示的列是users.name& users.photo。所有表目前都有唯一的userID,即users.id和survey.id,它们可以帮助匹配跨数据库的用户。
任何人都可以帮我解决这个问题吗?事先感谢,我在解决这个问题上遇到了很多麻烦。
select a.id yourId,
b.id matchId,
abs(a.q1 - b.q1) + abs(a.q2 - b.q2) + abs(a.q3 - b.q3)+ abs(a.q4 - b.q4)+
abs(a.q5 - b.q5)+ abs(a.q6 - b.q6)+ abs(a.q7 - b.q7)+ abs(a.q8 - b.q8)+
abs(a.q9 - b.q9)+ abs(a.q10 - b.q10) scorediff
from surveys as a
inner join surveys as b on a.id != b.id
WHERE a.id=1
order by scorediff asc
目前,这是该查询的结果:
| yourID| matchID| scoreDiff|
----------------------------
| 5 | 2 | 14 |
| 5 | 3 | 25 |
| 5 | 1 | 33 |
| 5 | 6 | 34 |
我希望这样做结果:
| yourID| matchID| scoreDiff| name | photo |
----------------------------------------------
| 5 | 2 | 14 | john | url
| 5 | 3 | 25 | steve| url
| 5 | 1 | 33 | jane | url
| 5 | 6 | 34 | kelly| url
matchID可以与users.ID列匹配,因为它们对用户都是唯一的。
答案 0 :(得分:0)
添加一个带有外键约束的新列
ALTER TABLE surveys
ADD COLUMN id_user REFERENCES user(id);
或相反,如果那是你想要的。不确定这是不是mysql语法。
然后您可以通过
加入表格WHERE u.id = s.id_user
答案 1 :(得分:0)
这应该(也)是一个评论,但它有点长。
on a.id!= b.id
鉴于其他地方的逻辑,这意味着您将获得"调查的每个组合"上市两次。为什么不:
在a.id< b.id
上
(请注意,如果index.id上有索引,这实际上可能导致qquery变慢,而不是使用上述连接表达式时没有索引)
abs(a.q1 - b.q1)+ abs(a.q2 - b.q2)
因此您在同一关系中将多个值表示为不同的属性。这个不好。它打破了关于正常化的规则,让你的生活变得更加困难。 (和我们的)。
此外,在我看来,你正在添加差异的腹肌,创造了一个相当扭曲的个人之间差异的画面。
考虑:
1
在这里,根据您的计算,2个用户之间的得分为4,但我会将上述数据解释为两个用户的得分相同。这真的是你的意图吗?