2014-09-12 3 views
1

У меня есть следующий запрос, который возвращает что-то вроде «top» -> '30', 'metrictype' -> 'cpu usage' (запрос вычисляет среднее использование CPU/MEM для 20 процентиль тяжелые ходовые машиныUnion all same query дважды возвращает null

SELECT round(avg(avgcpuusage)) as 'top', metrictype 
FROM  
    ( 
SELECT (vmstatstemp.avgcpuusage), 
    vmstatstemp.vmname, 
    vmstatstemp.metrictype, 
    @counter := @counter +1 AS counter 
    FROM (select @counter:=0) AS initvar, (select round(avg(vmstats.metricvalue)) as 'avgcpuusage', vmstats.vmname, 
    vmstats.metrictype from vmstats 
    join vms on vms.naam = vmstats.vmname 
    join klanten on vms.klant = klanten.ID 
    where metrictype = 'cpu usage' 
    AND SUBSTRING(vmstats.dataEntryTimestamp,4,7) = date_format(now(),'%m:%Y') 
    group by vmname 
    order by avgcpuusage desc) vmstatstemp 
    ) as temp 
where counter < round(0.2* (@counter+1)) 

Если I союз этот запрос с его собственным (см ниже), я получаю следующий результат:.

'сверху' -> '30', 'metrictype' -> 'cpu usage' 'top' -> 'null', 'metrictype' -> 'null'

SELECT round(avg(avgcpuusage)) as 'top', metrictype 
FROM  
    ( 
SELECT (vmstatstemp.avgcpuusage), 
    vmstatstemp.vmname, 
    vmstatstemp.metrictype, 
    @counter := @counter +1 AS counter 
    FROM (select @counter:=0) AS initvar, (select round(avg(vmstats.metricvalue)) as 'avgcpuusage', vmstats.vmname, 
    vmstats.metrictype from vmstats 
    join vms on vms.naam = vmstats.vmname 
    join klanten on vms.klant = klanten.ID 
    where metrictype = 'cpu usage' 
    AND SUBSTRING(vmstats.dataEntryTimestamp,4,7) = date_format(now(),'%m:%Y') 
    group by vmname 
    order by avgcpuusage desc) vmstatstemp 
    ) as temp 
where counter < round(0.2* (@counter+1)) 


union all 


SELECT round(avg(avgcpuusage)) as 'top', metrictype 
FROM  
    ( 
SELECT (vmstatstemp.avgcpuusage), 
    vmstatstemp.vmname, 
    vmstatstemp.metrictype, 
    @counter := @counter +1 AS counter 
    FROM (select @counter:=0) AS initvar, (select round(avg(vmstats.metricvalue)) as 'avgcpuusage', vmstats.vmname, 
    vmstats.metrictype from vmstats 
    join vms on vms.naam = vmstats.vmname 
    join klanten on vms.klant = klanten.ID 
    where metrictype = 'cpu usage' 
    AND SUBSTRING(vmstats.dataEntryTimestamp,4,7) = date_format(now(),'%m:%Y') 
    group by vmname 
    order by avgcpuusage desc) vmstatstemp 
    ) as temp 
where counter < round(0.2* (@counter+1)) 

Я не понимаю, почему мой результат 'сверху' -> '30', 'metrictype' -> 'Использование процессора' 'сверху' -> 'нулевой', 'metrictype' -> 'нулевой' вместо 'top' -> '30', 'metrictype' -> 'cpu usage' 'top' -> '30', 'metrictype' -> 'cpu usage', Кто-нибудь может это объяснить? (И сделать предложение о том, как получить правильный результат?)

+0

Используйте другую переменную для двух подзапросов. Вероятно, это проблема, когда инициализируется '@ counter'. –

+0

@GordonLinoff Ваше предложение сработало! Большое спасибо! У вас есть какие-либо объяснения, почему одно и то же переменное имя вызывает это явление (возможно, вы должны опубликовать свой ответ в качестве решения :)) – user3231622

ответ

1

Как Гордон Линофф отметил: вам нужно использовать другую переменную для двух подзапросов