我有一个包含symptom_ratings
,id
,user_id
,review_id
,symptom_id
和{{1}列的表格rate
}。
每个评论都可以在strain_id
中有多个条目,每个症状一个。
我想搜索包含用户搜索的所有symptom_ratings
的每个strain_id
。
即给定列:
symptom_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
的43和12只应返回symptom_id
3的结果。
我目前使用以下strain_id
条件:
WHERE
其中Strain.id IN (SELECT strain_id
FROM symptom_ratings
WHERE symptom_id
IN ($symptoms))
是逗号分隔的$symptoms
值列表。
我的问题是这个查询目前执行OR搜索(即它找到具有任何症状的菌株),而我更喜欢AND搜索(即找到具有<的菌株) em>所有的症状)。我怎样才能做到这一点?
答案 0 :(得分:1)
执行此操作的一种方法是按应变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
)。