在不同 table 的多个条件下使用 MySQL Count()

Using MySQL Count() with multiple conditions in different table

我有以下表格。

User_Location TABLE

  User_id|location_id
  _______|____________
     1   |     3        
     2   |     2    
     3   |     1
     4   |     1

User_Hobby TABLE

  User_id|  Hobby_id
  _______|____________
     1   |     1        
     1   |     3      
     1   |     5
     1   |     7        
     1   |     9      
     2   |     2
     2   |     4        
     2   |     6      
     2   |     8
     2   |     10        
     3   |     1     
     3   |     2
     3   |     3        
     3   |     4      
     3   |     5
     4   |     2     
     4   |     4
     4   |     6        
     4   |     8      
     4   |     10

每个用户都有五个爱好和一个地点。我想统计相同爱好的数量。例如,如果我的爱好列表是 [1,2,3,4,5] 并且 Location_id 是 1,我需要结果是这样的。

  User_id|matched_hobby
  _______|____________
     3   |     5         ->[1,2,3,4,5] matched
     4   |     2         ->[2,4] matched

关于实施的任何想法?

********************* 更新 ************* ********

当只有一个 location_id 时,Alex Martelli 的回答非常有效。如果 Tabel 中有 location_id 的范围怎么办? 例如)

  User_id|location_id
  _______|____________
     1   |     3        
     2   |     2      
     3   |     10
     3   |     11
     3   |     12
     4   |     50
     4   |     51
     4   |     52

SELECT uh.User_id, 计数(uh.Hobby_id)

FROM User_Location ul JOIN User_Hobby uh USING (User_id)

哪里 (ul.Location_id >= 5 和 ul.Location_id <= 15)

AND uh.Hobby_id 在 (1, 2, 3, 4, 5)

分组依据(uh.User_id)

不工作。它returns[#matched_hobby]*[#location_id]

应该是

  User_id|matched_hobby
  _______|____________
     3   |     5         ->[1,2,3,4,5] matched 

看起来像

SELECT uh.User_id, COUNT(uh.Hobby_id)
   FROM User_Location ul JOIN User_Hobby uh USING (User_id)
   WHERE ul.Location_id = 1
     AND uh.Hobby_id in (1, 2, 3, 4, 5)
     GROUP BY (uh.User_id)

应该会给出您要查找的结果。

试试这个

SELECT uh.User_id, COUNT(uh.Hobby_id)
FROM User_Location ul 
INNER JOIN User_Hobby uh ON ul.User_id = uh.User_id
WHERE uh.Hobby_id in (1, 2, 3, 4, 5)
AND (ul.Location_id >= 5 AND ul.Location_id <= 15)
GROUP BY uh.User_id, ul.Location_id