我有一个像这样设置的表格...这大大简化了,使问题更容易提出。
|id|hobby |person |enjoyment
-------------------------------
| |soccer |john |10
| |soccer |jake |5
| |baseball |john |3
| |baseball |nate |5
| |baseball |jordan |2
| |tennis |john |3
| |tennis |nate |7
| |chess |john |10
| |chess |nate |3
每个人都有一个他们享受特定爱好的分数。如果他们在数据库中没有特定爱好的记录,我们认为他们没有参与。
鉴于1个人,我需要知道谁至少参与了最相似的爱好。在上面的例子中,如果我选择John,它应该将Nate设置为(3),因为他们共享3个共同的爱好(棒球,网球和国际象棋),jake和jordan都会得到(1)
我当然可以通过多个查询来做到这一点......
SELECT hobbies FROM tblname WHERE person='john';
SELECT person FROM tblname WHERE hobbies='baseball'
AND hobbies='tennis' AND hobbies='chess' AND name!='john'
并继续这样做,但似乎效率低下。
是否有一个优化的查询来执行此类操作?
答案 0 :(得分:0)
SELECT something
, COUNT(*)
FROM hobbies john
JOIN hobbies notjohn
ON notjohn.something <> john.something
AND notjohn.some_other_thing = john.some_other_thing
WHERE john.person = 'x'
GROUP
BY ?.?;
答案 1 :(得分:0)
所以,这是一个解决方案,用子查询完成,这可能不是最有效的方法。
我认为查询是不言自明的。
您可以计算兴趣爱好列表中所返回的行数。
我认为这可以在某种循环中完成,所以我可以在where子句中使用john。
SELECT person, COUNT(*) AS nbrMatches FROM hobbies
WHERE hobby IN
(SELECT hobby FROM hobbies WHERE
person='john')
AND person <> 'john'
GROUP BY person
ORDER BY nbrMatches DESC
答案 2 :(得分:0)
你可以测试它sqlfiddle。 http://sqlfiddle.com/#!2/86e74/6/1
SELECT t_other.person, count(*)
FROM tbl as t_john, tbl as t_other
WHERE t_john.person = 'john'
AND t_other.hobby = t_john.hobby
AND t_other.person != 'john'
GROUP BY t_other.person;
答案 3 :(得分:0)
sqlFiddle example是我认为您正在寻找的 已经在上面回答了。