在MySQL中的同一个表中查找具有类似属性的条目

时间:2013-11-24 00:53:43

标签: mysql sql join

我有一个像这样设置的表格...这大大简化了,使问题更容易提出。

|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'

并继续这样做,但似乎效率低下。

是否有一个优化的查询来执行此类操作?

4 个答案:

答案 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是我认为您正在寻找的 已经在上面回答了。