Mysql - 获取同一表中的行交集[重复]
Posted
技术标签:
【中文标题】Mysql - 获取同一表中的行交集[重复]【英文标题】:Mysql - Get intersection of rows in same table [duplicate] 【发布时间】:2019-11-04 20:37:07 【问题描述】:我有这个简单的表(称为jobs_criterias
):
+-----------+---------+-------------+
| id | job_id | criteria_id |
+-----------+---------+-------------+
| 101 | 4 | 3 |
| 105 | 6 | 5 |
| 130 | 8 | 5 |
| 132 | 9 | 5 |
| 133 | 6 | 7 |
| 150 | 7 | 8 |
| 160 | 8 | 9 |
+-----------+---------+-------------+
我想找到具有相同criteria_id
的job_id
。
例如,我想在job_id
中搜索criteria_id IN (5, 7)
。它应该返回 6 和样本数据(只有 job_id
= 6 匹配 criteria_ids
)
经过一些搜索,我使用了这个查询:
SELECT DISTINCT
job_id
FROM jobs_criterias jc1
INNER JOIN jobs_criterias jc2 USING(job_id)
WHERE jc1.criteria_id = 5 AND jc2.criteria_id = 7
它可以工作,但是这个查询不容易扩展。我使用 php 框架的查询生成器,很难构建这种查询。
有没有更简单的方法来实现这一点?
【问题讨论】:
假设(job_id, criteria_id)
上存在UNIQUE
约束(或相反),您应该能够删除DISTINCT
。你到底是什么问题,你想避免什么?
【参考方案1】:
您可以使用分组查询来计算给定 job_id
匹配的 criteria_id
的数量,仅选择与所有这些匹配的那些:
SELECT job_id
FROM jobs_criterias
WHERE criteria_id IN (5, 7)
GROUP BY job_id
HAVING COUNT(DISTINCT criteria_id) = 2
输出
6
Demo on dbfiddle
【讨论】:
非常好,适合我。谢谢 @VincentDecaux 不用担心。请注意,正如问题的 cmets 所述,如果给定的(job_id, criteria_id)
组合只能有一个条目,则不需要 COUNT
中的 DISTINCT
。
是的,你是对的,这个 DISTINCT 在我最初的查询中出错了以上是关于Mysql - 获取同一表中的行交集[重复]的主要内容,如果未能解决你的问题,请参考以下文章