【问题标题】:SQL Query Select based on a condition with Group BySQL Query Select 基于具有 Group By 的条件
【发布时间】:2018-06-08 04:23:11
【问题描述】:

我有一个 Batch 实体和一个 Job 实体。一个 Batch 可以有多个 Job。

现在,Job 有一个名为 'status' 的列,其值为 'REVIEW', 'NEW', 'EDIT''QA'

如果属于这些批次的任何作业的状态为'REVIEW',我需要选择值为'YES' 的所有批次,如果没有作业的状态为'REVIEW',则需要选择'NO',并且查询将按分组批处理。

Select Batches.name, Batches.<column_I_need>, Batches.user_id
INNER JOIN Jobs ON Jobs.batch_id = Batches.id
GROUP BY Batches.id;

【问题讨论】:

标签: mysql sql group-by


【解决方案1】:

使用条件聚合来检查您的需求:

SELECT
    b.id,
    b.name,
    b.user_id,
    CASE WHEN SUM(CASE WHEN j.status = 'REVIEW' THEN 1 ELSE 0 END) > 0
         THEN 'YES'
         ELSE 'NO' END AS status
FROM Batches b
INNER JOIN Jobs j
    ON j.batch_id = b.id
GROUP BY
    b.id;

假设Batches.id是该表的主键列,那么如果我们GROUP BY该列我们也可以从Batches表中选择任何列。

【讨论】:

  • @RajeshOmanakuttan 如果它解决了您的问题,您能否将此答案标记为正确?
【解决方案2】:

我会使用case exists

Select b.name, b.user_id,
       (case when exists (select 1
                          from jobs j
                          where j.batch_id = b.id and j.status = 'Review'
                         )
             then 'Yes' else 'No'
        end) as status
from batches b;

这种方法比聚合方法更有效,因为它消除了group by。使用jobs(batch_id, status) 上的索引,这将具有最佳性能。

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 2011-08-31
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多