如何将此 MySql 子查询转换为连接查询?

时间:2021-03-26 20:26:14

标签: mysql join subquery

我创建了一个 mysql 查询,其中包含一个我想转换为连接查询的子查询。

我使用子查询的原因是我需要将最后的 where 条件应用于该子查询的结果。这是查询:

 select date, system_name, device_name, valid_read_rate from 
(SELECT  left(from_unixtime(c.capture_time/1000),10) as date,  a.name as 'system_name', b.name as 'device_name', c.read_count, c.valid_object_count, 
if(valid_object_count = 0,'00.00%',concat(format(read_count/valid_object_count*100,2),'%')) as valid_read_rate, read_count/valid_object_count*100 as valid_read_rate_unformatted
FROM  sick_il_services.system_config a
join sick_il_services.system_device b
on a.id = b.system_id
join sick_il_aap.daily_device_read_rate c
on b.id = c.device_id
where 1=1
group by c.capture_time,a.name, b.name
order by c.capture_time, a.name, b.name) as sub
where sub.valid_read_rate_unformatted < 100

我只是在这方面无法追踪。欢迎任何建议。

1 个答案:

答案 0 :(得分:2)

只要您使用的任何格式都允许您稍后过滤列,根据我的了解,子查询并没有特别多的作用。这应该涵盖您在做什么,但是,如果没有 CREATE TABLE 语法,我无法验证答案。

SELECT left(from_unixtime(c.capture_time / 1000), 10)                    as date,
       a.name                                                            as 'system_name',
       b.name                                                            as 'device_name',
       c.read_count,
       c.valid_object_count,
       if(valid_object_count = 0, '00.00%',
       concat(format(read_count / valid_object_count * 100, 2), '%')) as valid_read_rate
FROM sick_il_services.system_config a
         join sick_il_services.system_device b on a.id = b.system_id
         join sick_il_aap.daily_device_read_rate c on b.id = c.device_id
where (c.read_count / c.valid_object_count * 100) < 100
group by c.capture_time, a.name, b.name
order by c.capture_time, a.name, b.name

根据评论更新

在您的评论中,您提到您可能正在寻找分组的总和。在这种情况下,您可能希望按照以下方式做一些事情

SELECT left(from_unixtime(c.capture_time / 1000), 10)                    as date,
       a.name                                                            as 'system_name',
       b.name                                                            as 'device_name',
       c.read_count,
       c.valid_object_count,
       if(valid_object_count = 0, '00.00%',
       concat(format(read_count / valid_object_count * 100, 2), '%')) as valid_read_rate
FROM sick_il_services.system_config a
         join sick_il_services.system_device b on a.id = b.system_id
         join sick_il_aap.daily_device_read_rate c on b.id = c.device_id
group by c.capture_time, a.name, b.name
having (sum(read_count)/sum(valid_object_count)) < 1
order by c.capture_time, a.name, b.name