2011-10-23 76 views
0

我有一個Facebook的數據庫從幾個人喜歡。在許多「user_id」中有重複的「like_id」字段。我想要一個查詢,它將查找「person_id」的人A與人B有共同的數量。複雜的MySQL查詢 - 查找重複的每個user_id?

此查詢對比較僅在數據庫中只有2個「user_id」時比較喜歡的查詢,但只要我添加了第三個,它把它弄混了。基本上,我想看看誰與人A有最多的「喜歡」。

SELECT *, 
     COUNT(*) 
    FROM likes 
GROUP BY like_id 
    HAVING COUNT(*) > 1 

任何人都有可能工作的查詢嗎?

+0

「LIKE」表的CREATE TABLE語句會更好地解決您的問題。 –

回答

0

我想這會做到這一點:

SELECT 
    likes_a.user_id, 
    likes_b.user_id 
FROM 
    likes as likes_a JOIN likes as likes_b 
ON 
    likes_a.like_id = likes_b.like_id 
WHERE 
    likes_a.user_id <> likes_b.user_id 

然後後期處理的結果,計數誰擁有共同的大多數。

+0

這是接近但不完全。我得到的結果是10,9和7共同點,但是當我做查詢並隔離2個用戶ID時,我得到了6和3的共同點。 –

+0

我想我明白這是行不通的。我認爲你需要後處理結果。我不認爲純SQL中可能有解決方案。或者如果是這樣的話,它將僅適用於單個用戶(在這種情況下,您通過遍歷每個用戶來預處理)。 – ObscureRobot

1

該SQL應該工作。你只需要放入用戶A的user_id,它應該與所有其他用戶比較,並顯示最匹配的一個。您可以將其更改爲顯示前5名或執行其他任何您需要的操作。

基本上它在做什麼是它在表上做一個自聯接,但確保當它進行聯接時,它是一個不同的user_id,但「like」是相同的。然後它由每個其他user_id執行一個組,併爲該user_id加上相同數量的贊成數。

SELECT all_other_likes.user_id, count(all_other_likes.like_id) AS num_similar_likes 
FROM likes original_user_likes 
JOIN likes all_other_likes 
ON  all_other_likes.user_id != original_user_likes.user_id 
AND  original_user_likes.like_id = all_other_likes.like_id 
WHERE original_user_likes = USER_ID_YOU_WANT_TO_COMPARE 
GROUP BY all_other_likes.user_id 
ORDER BY count(all_other_likes.like_id) DESC 
LIMIT 1; 

不確定你使用的是哪個數據庫。如果是MS-SQL,您可能需要執行SELECT TOP 1,但這是有效的PostgreSQL和MySQL語法。