Част от проблема ви е, че използвате агрегатна функция в списъка SELECT, но не използвате GROUP BY
. Трябва да използвате GROUP BY
подобно на това:
ГРУПА ПО d.testId, d.rowId
Всеки път, когато използвате агрегатна функция и имате други колони във вашия избор, те трябва да са в група по. Така че пълната ви заявка трябва да бъде:
изберете d.testId, d.rowId, max(if(f.keyName='voltage',f.keyValue,NULL)) като 'напрежение', max(if(f.keyName='temperature' ,f.keyValue,NULL)) като „температура“, max(if(f.keyName='velocity',f.keyValue,NULL)) като „скорост“ от тестове t данни за вътрешно свързване d на t.testId =d. testId данни за вътрешно присъединяване c на t.testId =c.testId и c.rowId =d.rowId данни за присъединяване f на f.testId =t.testId и f.rowId =d.rowId където (d.keyName ='напрежение' и d.keyValue <5) и (c.keyName ='temperature' и c.keyValue =30) и (t.testType ='testType1')GROUP BY d.testId, d.rowId
Имайте предвид, че действителната ви структура от данни не е представена в оригиналния ви въпрос. Изглежда, че това може да бъде консолидирано до следното:
изберете d.testid, d.rowid, max(случай, когато d.keyName ='напрежение' и d.keyValue <5, след което d.keyValue край) напрежение, макс (случай, когато d.keyName ='температура ' и d.keyValue =30 след това d.keyValue end) температура, макс (случай, когато d.keyName ='velocity', след това d.keyValue край) velocityfrom tests tleft join data d on t.testid =d.testidgroup от d.testid , d.rowid
Вижте SQL Fiddle с демонстрация
. Това дава резултат само с едно присъединяване към data
таблица: