搜索列包含所有给定值

时间:2015-04-28 20:59:26

标签: mysql

我有一个包含symptom_ratingsiduser_idreview_idsymptom_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>所有的症状)。我怎样才能做到这一点?

1 个答案:

答案 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

Here's a quick online demo.

这种方法的一个潜在有用的特点是,通过改变它来扩展它以支持“所有这些”,“任何这些”和“至少 n 这些”搜索是微不足道的HAVING子句中的条件。对于后一种情况,您还可以根据匹配症状的数量对结果进行排序(例如,使用ORDER BY matched_symptoms DESC)。