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_idjob_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 - 获取同一表中的行交集[重复]的主要内容,如果未能解决你的问题,请参考以下文章

mysql获取两个集合的交集和差集

mysql中有2个结构一样的表,我想把两个表的交集存到另一个表中,请问怎么操作呢?

sql求交集与差集

linux 日志

Mysql怎样求对同一个表的多个查询的交集

MySQL - 基于同一表中的行求和列值