挣扎着MySQL子查询

tat*_*y27 0 mysql

我有两张桌子,imagegradeReason.每个图像被授予等级为它的质量和用户可以选择最多4倍不同的原因(reasonID_1,reasonID_2,reasonID_3,reasonID_4)通过使用选择reasonID.原因的细分存储在gradeReason表格中.

image

imageID   auditID  reasonID_1  reasonID_2  reasonID_3  reasonID_4
-------   -------  ----------  ----------  ----------  ----------
1         123      1           13          7           3
2         124      8           13          8           6 
4         125      3           2           5           6
5         125      7           4           2           3

gradeReason

reasonID   category   name
--------   --------   ----
1          exposure   overexposed
2          exposure   underexposed
3          patient    patient moved
4          equipment  sensor too big
5          equipment  sensor too small
Run Code Online (Sandbox Code Playgroud)

我想要的是一个查询,它将返回每个reasonID在审计中使用的次数以及gradeReason的名称是什么

例如

审计125 -

reasonID 3被使用了两次 - 名字'病人感动',

reasonID 2使用了两次 - 名称为"曝光不足".

我会诚实地说,我已经挣扎了好几天,我甚至不知道从哪里开始.

Gor*_*off 5

这更难,因为您的数据未正确规范化.以下方法首先规范化数据,然后进行连接和聚合:

select ir.auditId, gr.ReasonId, gr.category, gr.name, count(*) as cnt
from (select i.imageID, i.auditID,
             (case when n.n = 1 then ReasonID_1
                   when n.n = 2 then ReasonID_2
                   when n.n = 3 then ReasonID_3
                   when n.n = 4 then ReasonID_4
              end) as ReasonId
      from image i cross join
           (select 1 as n union all select 2 union all select 3 union all select 4
           ) n
      ) ir join
      gradeReason gr
      on ir.ReasonId = gr.ReasonId
group by ir.auditId, gr.ReasonId, gr.category, gr.name
order by cnt desc; 
Run Code Online (Sandbox Code Playgroud)