繁体   English   中英

仅当 Select 记录包含所有行的相同列值时

[英]Select record only if it contains same column value for all rows

我有一张如下表。

样本数据。

如果它被所有人拒绝,我只想要job_id

如果没有被所有人拒绝,我尝试使用group by来计算结果。

所以,我会检查是否至少有一条记录仍然没有被拒绝。

但它会给我jobs not rejected by all

我想要那些rejected by all工作的job_id

在上面的示例中,它应该给出job_id =2的记录

  const jobRejectedByAll = await MatchedTechnician.findAll({
    where: {
      is_rejected: false,
      job_id: allMatchedJobs,
    },
    group: ['job_id'],
    having: sequelize.literal(`count(job_id) > 1`),
  });

询问:

SELECT job_id
     , 
  FROM matched_technicians AS MatchedTechnician
 WHERE MatchedTechnician.is_rejected = FALSE 
   AND MatchedTechnician.job_id IN (2, 3)
 GROUP 
    BY job_id
 HAVING COUNT(job_id) > 1;

您可以使用NOT EXISTS查询来检查is_rejected的值是否为false

SELECT DISTINCT job_id
FROM matched_technicians m1
WHERE NOT EXISTS (SELECT * 
                  FROM matched_technicians m2 
                  WHERE m2.job_id = m1.job_id 
                    AND (m2.is_rejected = false
                      OR m2.is_rejected IS NULL)
                  )

Output:

job_id
2

dbfiddle 上的演示

另一种查询方式是计算给定job_id的行数,并将其与true值的数量进行比较; 如果它们相同,则作业已被拒绝:

SELECT job_id
FROM matched_technicians
GROUP BY job_id
HAVING COUNT(*) = SUM(is_rejected)

dbfiddle 上的演示

更新

第二种方法的续集版本:

 const jobsRejectedByAllTechs = await MatchedTechnician.findAll({
    group: ['job_id'],
    having: Sequelize.literal('count(*) = SUM(is_rejected)'),
    attributes: ['job_id'],
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM