MySQL 如何在存在任何值时选择值,或者如果全部匹配则回退到值

问题描述 投票:0回答:1

假设我有这两张桌子

餐桌要求:

ID_请求 用户
1 亚当
2
3 查理

表评论:

ID_REVIEW ID_请求 评论
1 1 已批准
2 1 已批准
3 1 拒绝
4 2 已批准
5 2 已批准

我想选择我的所有请求,加入到评论表中,这样,如果any DENIED 条目存在,则“评论”字段被拒绝;如果only APPROVED 存在,则“评论”字段被批准;如果没有评论,则为 NULL/第三个值完全没有。

我希望我的输出是:

ID_请求 用户 评论
1 亚当 拒绝
2 已批准
3 查理 NULL(或待处理)

我想我想要一个 LEFT JOIN 来捕获根本不存在的评论。我正在尝试做类似 GROUP BY 的事情,尽管也许 CASE 更合适。我不认为 COALESCE 是我需要的,但我很高兴我错了!

mysql select left-join mysql-8.0
1个回答
0
投票

这可以使用条件聚合来完成:

SELECT ID_REQUEST, USER, CASE WHEN COUNT_DENIED > 0 THEN 'DENIED'
                              WHEN COUNT_APPROVED = TOTAL_REVIEW AND TOTAL_REVIEW > 0 THEN 'APPROVED'
                              ELSE 'PENDING'
                         END AS REVIEW
FROM (
  SELECT rq.ID_REQUEST, rq.USER, 
         COUNT(CASE WHEN REVIEW = 'DENIED' THEN 1 END) AS COUNT_DENIED,
         COUNT(CASE WHEN REVIEW = 'APPROVED' THEN 1 END) AS COUNT_APPROVED,
         COUNT(REVIEW) AS TOTAL_REVIEW
  FROM REQUESTS rq
  LEFT JOIN REVIEWS rv ON rq.ID_REQUEST = rv.ID_REQUEST
  GROUP BY rq.ID_REQUEST, rq.USER
) AS s

结果:

ID_REQUEST  USER    REVIEW
1           Adam    DENIED
2           Ben     APPROVED
3           Charlie PENDING

演示在这里

© www.soinside.com 2019 - 2024. All rights reserved.