简体   繁体   English

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

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

I have a table as below.我有一张如下表。

样本数据。

I only want job_id if it is rejected by all.如果它被所有人拒绝,我只想要job_id

I tried using group by to count the result if it is not rejected by all.如果没有被所有人拒绝,我尝试使用group by来计算结果。

So, I will check if at least one record is as such which is still not rejected.所以,我会检查是否至少有一条记录仍然没有被拒绝。

But it will give me the jobs not rejected by all .但它会给我jobs not rejected by all

I want job_id of those jobs which is rejected by all .我想要那些rejected by all工作的job_id

In the example above It should give record with job_id =2在上面的示例中,它应该给出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`),
  });

Query:询问:

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;

You could use a NOT EXISTS query to check that no value of is_rejected is false :您可以使用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: Output:

job_id
2

Demo on dbfiddle dbfiddle 上的演示

An alternate queryway to do this is to count the number of rows for a given job_id and compare it with the number of true values;另一种查询方式是计算给定job_id的行数,并将其与true值的数量进行比较; if they are the same, the job has been rejected:如果它们相同,则作业已被拒绝:

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

Demo on dbfiddle dbfiddle 上的演示

Update更新

Sequelize version for second approach:第二种方法的续集版本:

 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