Bagian dari masalah Anda adalah Anda menggunakan fungsi agregat dalam daftar SELECT tetapi Anda tidak menggunakan GROUP BY
. Anda harus menggunakan GROUP BY
mirip dengan ini:
GROUP BY d.testId, d.rowId
Setiap kali Anda menggunakan fungsi agregat dan Anda memiliki kolom lain dalam pilihan Anda, mereka harus berada dalam grup menurut. Jadi kueri lengkap Anda seharusnya:
select d.testId,
d.rowId,
max(if(f.keyName='voltage',f.keyValue,NULL)) as 'voltage',
max(if(f.keyName='temperature',f.keyValue,NULL)) as 'temperature',
max(if(f.keyName='velocity',f.keyValue,NULL)) as 'velocity'
from tests t
inner join data d
on t.testId = d.testId
inner join data c
on t.testId = c.testId
and c.rowId = d.rowId
join data f
on f.testId = t.testId
and f.rowId = d.rowId
where (d.keyName = 'voltage' and d.keyValue < 5)
and (c.keyName = 'temperature' and c.keyValue = 30)
and (t.testType = 'testType1')
GROUP BY d.testId, d.rowId
Catatan, sementara struktur data Anda yang sebenarnya tidak disajikan dalam pertanyaan awal Anda. Tampaknya ini dapat dikonsolidasikan sebagai berikut:
select d.testid,
d.rowid,
max(case when d.keyName = 'voltage' and d.keyValue < 5 then d.keyValue end) voltage,
max(case when d.keyName = 'temperature' and d.keyValue =30 then d.keyValue end) temperature,
max(case when d.keyName = 'velocity' then d.keyValue end) velocity
from tests t
left join data d
on t.testid = d.testid
group by d.testid, d.rowid
Lihat SQL Fiddle dengan Demo
. Ini memberikan hasil dengan hanya satu bergabung ke data
tabel:
| TESTID | ROWID | VOLTAGE | TEMPERATURE | VELOCITY |
-----------------------------------------------------
| 1 | 1 | 4 | 30 | 20 |
| 1 | 2 | 4 | 30 | 21 |
| 2 | 1 | 4 | 30 | 30 |
| 2 | 2 | 4 | 30 | 31 |