在不同 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
我有以下表格。
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