2012-04-05 2 views
2

У меня длинный запрос mysql, который строит отчет, проблема заключается в том, что поле верхнего уровня «a.id» неизвестно только одному из подзапросов , этот запрос представляет собой выбор из «select with alias». Я установил раздел оскорбления между комментариями (выделенными) ниже. Как получить поле верхнего уровня, распознанное в подзапросе?MYSQL: поле «запрос верхнего уровня» неизвестно в подзапросе

Обратите внимание: запрет на выделенное выделение запроса работает нормально, и он пока еще не был «улучшен» для эффективности, это первый быстрый запуск отчета POC.

Дальнейшее примечание. Я удалил все данные, относящиеся к компании, а также отступы, чтобы помочь мне «прочитать запрос в разделах», кроме того, что все части должны по-прежнему связываться для формирования функционального запроса (опять же: запрет выбора). :-)

mysql_query("select distinct 
a.companyname as MEM, 
b.vendorid as VID, 
b.alphacode as ALPHA, 
b.vendorstate as STATE, 
b.exchange as EXC, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'A') as A, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'B') as B, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'C') as C, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'D') as D, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'E') as E, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'F') as F, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'G') as G, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'H') as H, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'I') as I, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'J') as J, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'K') as K, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'L') as L, 
(select count(memberid) from compa_memusergroups where memberid = a.id and software = 'M') as M, 
REPLACE(REPLACE((select count(memberid) from compa_memconndetails where memberid = a.id and type = 'POP'), '0', 'No'), '1', 'Yes') as POP, 
REPLACE(REPLACE(a.editandinfo, '0', ''), '1', 'x') as EDIT, 
REPLACE(REPLACE(a.infoonly, '0', ''), '1', 'x') as INFO, 
(select count(memberid) from compa_oldconnectivity where memberid = a.id and active = 1) as OLD, 
(select count(memberid) from compa_newconnectivity where memberid = a.id and active = 1) as NEW, 
(select count(memberid) from compa_ptconnectivity where memberid = a.id and ptactive = 1) as PTVAL, 
(select count(memberid) from compa_dcconnectivity where memberid = a.id and dcactive = 1) as DCVAL, 
IFNULL((select TRIM(LEADING '0' from substring(sysid,5,2)) from compa_compaconnectivity where memberid = a.id and refid = 'compa1'), 0) as compaLevel1, 
IFNULL((select TRIM(LEADING '0' from substring(sysid,5,2)) from compa_compaconnectivity where memberid = a.id and refid = 'compam'), 0) as compaLevel2, 
IFNULL((select TRIM(LEADING '0' from substring(sysid,5,2)) from compa_compaconnectivity where memberid = a.id and refid = 'compai'), 0) as compaLevel3, 
IFNULL((select TRIM(LEADING '0' from substring(sysid,5,2)) from compa_compaconnectivity where memberid = a.id and refid = 'compan'), 0) as compaLevel4, 
IFNULL((select TRIM(LEADING '0' from substring(sysid,5,2)) from compa_compbconnectivity where memberid = a.id and refid = 'compb1'), 0) as compbLevel1, 
IFNULL((select TRIM(LEADING '0' from substring(sysid,5,2)) from compa_compbconnectivity where memberid = a.id and refid = 'compbm'), 0) as compbLevel2, 
IFNULL((select TRIM(LEADING '0' from substring(sysid,5,2)) from compa_compbconnectivity where memberid = a.id and refid = 'compbi'), 0) as compbLevel3, 
IFNULL((select TRIM(LEADING '0' from substring(sysid,5,2)) from compa_compbconnectivity where memberid = a.id and refid = 'compbn'), 0) as compbLevel4, 
ROUND(
((
(IFNULL((select SUM(compa_memusersoft.bandwold) from compa_memusersoft 
inner join compa_oldconnectivity on compa_memusersoft.acron = compa_oldconnectivity.oldsoft 
where compa_oldconnectivity.memberid = a.id and compa_oldconnectivity.oldsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_oldconnectivity.active = 1), 0) 
+ IFNULL((select SUM(compa_memusersoft.bandwnew) from compa_memusersoft 
inner join compa_newconnectivity on compa_memusersoft.acron = compa_newconnectivity.newsoft 
where compa_newconnectivity.memberid = a.id and compa_newconnectivity.newsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_newconnectivity.active = 1), 0) 
+ (IF ((select count(*) from compa_ptconnectivity where memberid = a.id and ptsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_ptconnectivity.ptactive = 1) > 0, (select count(*) from compa_ptconnectivity where memberid = a.id and ptsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_ptconnectivity.ptactive = 1) * 0.020, 0)) 
+ (IF ((select count(*) from compa_dcconnectivity where memberid = a.id and dcsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_dcconnectivity.dcactive = 1) > 0, (select count(*) from compa_dcconnectivity where memberid = a.id and dcsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_dcconnectivity.dcactive = 1) * 0.352, 0))) 
+ 
(IF ((select count(*) from compa_compaconnectivity 
inner join compa_oldconnectivity on compa_compaconnectivity.memberid = compa_oldconnectivity.memberid 
where compa_compaconnectivity.memberid = a.id and compa_compaconnectivity.refid = 'compa1' and compa_oldconnectivity.oldsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_oldconnectivity.active = 1) > 0, 0.470 * 2, 
IF((select count(*) from compa_compaconnectivity 
where refid = 'compa1' and memberid = a.id and memberid not in (select memberid from compa_oldconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_newconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_ptconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_dcconnectivity where memberid = a.id)) > 0, 0.470 * 2, 0))) 
+ 
(IF ((select count(*) from compa_compaconnectivity 
inner join compa_newconnectivity on compa_compaconnectivity.memberid = compa_newconnectivity.memberid 
where compa_compaconnectivity.memberid = a.id and compa_compaconnectivity.refid = 'compam' and compa_newconnectivity.newsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_newconnectivity.active = 1) > 0, 0.893 * 2, 
IF((select count(*) from compa_compaconnectivity 
where refid = 'compam' and memberid = a.id and memberid not in (select memberid from compa_oldconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_newconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_ptconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_dcconnectivity where memberid = a.id)) > 0, 0.893 * 2, 0))) 
+ 
(IF ((select count(*) from compa_compaconnectivity 
inner join compa_oldconnectivity on compa_compaconnectivity.memberid = compa_oldconnectivity.memberid 
where compa_compaconnectivity.memberid = a.id and compa_compaconnectivity.refid = 'compai' and compa_oldconnectivity.oldsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_oldconnectivity.active = 1) > 0, 0.512 * 2, 
IF((select count(*) from compa_compaconnectivity 
where refid = 'compai' and memberid = a.id and memberid not in (select memberid from compa_oldconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_newconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_ptconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_dcconnectivity where memberid = a.id)) > 0, 0.512 * 2, 0))) 
+ 
(IF ((select count(*) from compa_compaconnectivity 
inner join compa_oldconnectivity on compa_compaconnectivity.memberid = compa_oldconnectivity.memberid 
where compa_compaconnectivity.memberid = a.id and compa_compaconnectivity.refid = 'compan' and compa_oldconnectivity.oldsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_oldconnectivity.active = 1) > 0, 0.512 * 2, 
IF((select count(*) from compa_compaconnectivity 
where refid = 'compan' and memberid = a.id and memberid not in (select memberid from compa_oldconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_newconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_ptconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_dcconnectivity where memberid = a.id)) > 0, 0.512 * 2, 0))) 
+ 
(IF ((select count(*) from compa_compbconnectivity inner join compa_oldconnectivity on compa_compbconnectivity.memberid = compa_oldconnectivity.memberid 
where compa_compbconnectivity.memberid = a.id and compa_oldconnectivity.oldsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_oldconnectivity.active = 1) > 0, 0.512 * 2, 
IF((select count(*) from compa_compbconnectivity inner join compa_newconnectivity on compa_compbconnectivity.memberid = compa_newconnectivity.memberid 
where compa_compbconnectivity.memberid = a.id and compa_newconnectivity.newsoft not in (select acron from compa_memusersoft where type = 'EXT') and compa_newconnectivity.active = 1) > 0, 0.512 * 2, 0))) 
+ 
(IF((select count(*) from compa_compbconnectivity where memberid = a.id and memberid not in (select memberid from compa_oldconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_newconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_ptconnectivity where memberid = a.id) 
and memberid not in (select memberid from compa_dcconnectivity where memberid = a.id)) > 0, 0.512 * 2, 0)) 
+ 

/*------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
IFNULL((select SUM(bandwreq * mplsterm) from (
select compa_memusersoft.acron, compa_memusersoft.bandwreq, compa_memconndetails.mplsterm from compa_memusersoft 
inner join compa_memconndetails on compa_memusersoft.acron = compa_memconndetails.software 
where compa_memusersoft.acron in (select oldsoft from compa_oldconnectivity where memberid = a.id) 
or compa_memusersoft.acron in (select newsoft from compa_newconnectivity where memberid = a.id) 
or compa_memusersoft.acron in (select ptsoft from compa_ptconnectivity where memberid = a.id) 
or compa_memusersoft.acron in (select dcsoft from compa_dcconnectivity where memberid = a.id) 
and compa_memconndetails.type = 'EXT' and compa_memconndetails.memberid = a.id group by compa_memusersoft.acron) tblval), 0) 
*/------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

) 
/(70/100) 
), 3) as REQBANDW, 
(IFNULL((select pribandw1 from compa_currmembandw where memberid = a.id), 0) + IFNULL((select pribandw2 from compa_currmembandw where memberid = a.id), 0) + 
IFNULL((select secbandw1 from compa_currmembandw where memberid = a.id), 0) + IFNULL((select secbandw2 from compa_currmembandw where memberid = a.id), 0) + 
IFNULL((select backbandw1 from compa_currmembandw where memberid = a.id), 0) + IFNULL((select backbandw2 from compa_currmembandw where memberid = a.id), 0)) as CURRBANDW, 
a.env 
from 
compa_member a 
inner join compa_memberconnectivity b on a.id = b.memberid 
order by a.env desc, a.companyname"); 
+0

Подзапрос в нарушившей часть не имеет особого смысла для меня. Вы группируете 'acron', но также извлекаете другие столбцы, один из которых принадлежит к объединенной таблице. Вы должны понимать, что если соединение производит более одной строки за акрон, и вы вытягиваете неагрегированные значения, которые не участвуют в группировке, эти значения будут случайными. И, прежде всего, внешний подзапрос выполняет вычисления ('SUM (compa_memusersoft.bandwreq * compa_memconndetails.mplsterm)') для этих потенциально случайных значений. Это по дизайну? –

ответ

1

Я хотел бы предложить изменения обижая часть, как это:

IFNULL(
    (
    /*select SUM(bandwreq * mplsterm) 
    from (*/ 
     select /*compa_memusersoft.acron,*/ SUM(compa_memusersoft.bandwreq * compa_memconndetails.mplsterm) 
     from compa_memusersoft 
     inner join compa_memconndetails on compa_memusersoft.acron = compa_memconndetails.software 
     where compa_memusersoft.acron in (select oldsoft from compa_oldconnectivity where memberid = a.id) 
     or compa_memusersoft.acron in (select newsoft from compa_newconnectivity where memberid = a.id) 
     or compa_memusersoft.acron in (select ptsoft from compa_ptconnectivity where memberid = a.id) 
     or compa_memusersoft.acron in (select dcsoft from compa_dcconnectivity where memberid = a.id) 
     and compa_memconndetails.type = 'EXT' 
     and compa_memconndetails.memberid = a.id 
     group by compa_memusersoft.acron 
    /*) tblval*/ 
), 
    0 
) 
+0

Большое спасибо Андрею, ваше предложение отлично поработало, за исключением того, что оно вернулось более чем на одну строку. Затем я «сгруппировал» все «или выбирает» в один отдельный отчет, и с вашими изменениями он работал отлично. Спасибо за помощь, очень ценим. (Теперь сидеть и оптимизировать все это !!!) – vigilantis

Смежные вопросы