簡體   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