mysql - 搜索列包含所有给定值的行组

标签 mysql

我有一个表 symptom_ratings 包含列 iduser_idreview_idsymptom_idratestrain_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

Here's a quick online demo.

此方法的一个可能有用的功能是,只需更改即可轻松扩展它以支持“所有这些”、“任何这些”和“至少 n 个”搜索HAVING 子句中的条件。对于后一种情况,您还可以按匹配症状的数量对结果进行排序(例如使用 ORDER BY matched_symptoms DESC)。

关于mysql - 搜索列包含所有给定值的行组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929817/

相关文章:

php - Laravel 数据表排序附加字段

mysql - MYSQL 失去所有权限

mysql - wamp mysql 无法连接到本地主机

mysql - Ruby-Mysql2 编码 utf8mb4 造成索引问题(从而影响性能)

mysql - 仅提取第一个 "percent"行

php - iOS 推送通知使用 PHP?

PHP PDO 准备插入 - 不插入数据且不显示错误

mysql - 连接同一主键 MYSQL 上的三个表

MySQL 查询多个 LEFT JOIN 与 WHERE 列 NOT LIKE

php - Mysql新手: sql select problem