我有一个表 symptom_ratings
包含列 id
、user_id
、review_id
、symptom_id
、rate
和 strain_id
。
每条评论可以在 symptom_ratings
中有多个条目,每个症状一个。
我想搜索具有用户搜索的所有 symptom_id
的每个 strain_id
。
也就是说,给定列:
review: 2, strain_id: 3, symptom_id: 43
review: 2, strain_id: 3, symptom_id: 23
review: 2, strain_id: 3, symptom_id: 12
review: 6, strain_id: 1, symptom_id: 3
review: 6, strain_id: 2, symptom_id: 12
搜索 symptom_id
的 43 和 12 应该只返回 strain_id
3 的结果。
我目前使用以下 WHERE
条件:
Strain.id IN (SELECT strain_id
FROM symptom_ratings
WHERE symptom_id
IN ($symptoms))
其中 $symptoms
是以逗号分隔的 symptom_id
值列表。
我的问题是此查询当前执行 OR 搜索(即它找到具有任何 症状的菌株),而我更喜欢 AND 搜索(即查找具有 任何 症状的菌株) em>所有 症状)。我怎样才能做到这一点?
最佳答案
执行此操作的一种方法是按菌株 ID 对行进行分组,计算每组中不同匹配症状的数量,并仅返回计数等于搜索的症状总数的那些行:
SELECT
strain_id,
COUNT(DISTINCT symptom_id) AS matched_symptoms
FROM symptom_ratings
WHERE symptom_id IN (43, 12)
GROUP BY strain_id
HAVING matched_symptoms = 2
此方法的一个可能有用的功能是,只需更改即可轻松扩展它以支持“所有这些”、“任何这些”和“至少 n 个”搜索HAVING
子句中的条件。对于后一种情况,您还可以按匹配症状的数量对结果进行排序(例如使用 ORDER BY matched_symptoms DESC
)。
关于mysql - 搜索列包含所有给定值的行组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929817/