【问题标题】:Mysql - Get intersection of rows in same table [duplicate]Mysql - 获取同一表中的行交集[重复]
【发布时间】: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。你到底是什么问题,你想避免什么?

标签: mysql sql


【解决方案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 在我最初的查询中出错了
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 2013-08-29
  • 2020-10-15
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多