[英]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.