2013-11-24 88 views
2

我有一個如此設置的表...這樣做很簡單,可以使問題更容易提出。在MySQL中查找具有相同屬性的條目

|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人,我需要知道誰至少參與了最相似的愛好。在上面的例子中,如果我選擇了約翰,那麼它應該將Nate設置爲(3),因爲他們共同擁有3種愛好(棒球,網球和象棋),傑克和約旦都會得到(1)

我可以做到這一點與當然多個查詢...

SELECT hobbies FROM tblname WHERE person='john'; 

SELECT person FROM tblname WHERE hobbies='baseball' 
     AND hobbies='tennis' AND hobbies='chess' AND name!='john' 

並繼續這樣做,但它似乎INCREDIBLY低效率。

是否有一個優化的查詢來做這種事情?

+1

加油 - 你可以做得比這更好! - 你的桌子上沒有名爲「愛好」的列 – Strawberry

回答

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 ?.?; 
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 
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; 
相關問題