2016-01-28 61 views
1

我有一個包含數百萬行含有userid,movieid和rating的行的電影分級表。MySQL - 在條件相同的情況下對多行進行分組

| userId | movieId | rating | 
------------------------------ 
| 1  | 213  | 5  | 
| 1  | 245  | 4  | 
| 2  | 213  | 4  | 
| 2  | 245  | 4  | 
| 3  | 657  | 5  | 
| 3  | 245  | 5  | 

我試圖找出一種將userId組合在一起的包含movieId匹配集合的userId的方法。理想情況下,我希望查詢只查找匹配,如果它們至少有5個movieId是共同的,並且評級高於4,但我已經簡化了它的示例。

在上面的實例中,userId 1和2將是唯一匹配的用戶,因爲它們都包含相同的movieIds。我需要一個基本上可以複製這個的聲明。預先感謝您的幫助。

+0

你可以共享任何查詢的結果你試過了嗎? –

+0

簡化很好,但我認爲在這種情況下您可能會過度簡化它。 – Strawberry

回答

1

可以進行自連接匹配電影,過濾掉不感興趣的收視率,按用戶對記錄,然後過濾,得到的組只有那些至少有匹配的記錄所需數量:

SELECT a.userId, b.userId 
FROM  myTable a JOIN myTable b USING (movieId) 
WHERE a.userId < b.userId 
    AND a.rating > 4 
    AND b.rating > 4 
GROUP BY a.userId, b.userId 
HAVING COUNT(*) >= 5 
+0

我喜歡這樣的外觀,並認爲它可能工作,但我有一個問題,查詢許多行導致服務器停滯不前。 – dmbll

+0

@ user3612532:表上定義了哪些索引? – eggyal

+0

只是一個ratingId列的主鍵,儘管我認爲它沒有太大的作用。如果這是所有基本的東西,我對SQL沒有太多的經驗,所以很抱歉。 – dmbll

1
select movieId, rating 
from tablename 
group by movieId 
having count(userId) > 1 and rating > 4; 

這給了我movieId 245和等級5,這要根據您提供的示例數據是正確的,有超過1個用戶名字和等級大於4

相關問題