Một phần vấn đề của bạn là bạn đang sử dụng hàm tổng hợp trong danh sách CHỌN nhưng bạn không sử dụng GROUP BY
. Bạn nên sử dụng GROUP BY
tương tự như sau:
GROUP BY d.testId, d.rowId
Bất cứ khi nào bạn đang sử dụng một hàm tổng hợp và bạn có các cột khác trong lựa chọn của mình, chúng phải nằm trong một nhóm theo. Vì vậy, truy vấn đầy đủ của bạn phải là:
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
Lưu ý, trong khi cấu trúc dữ liệu thực tế của bạn không được trình bày trong câu hỏi ban đầu của bạn. Có vẻ như điều này có thể được hợp nhất thành sau:
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
Xem SQL Fiddle with Demo
. Điều này cho kết quả chỉ có một phép nối với data
bảng:
| 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 |