आपकी समस्या का एक हिस्सा यह है कि आप चयन सूची में एक समग्र फ़ंक्शन का उपयोग कर रहे हैं लेकिन आप GROUP BY
का उपयोग नहीं कर रहे हैं . आपको GROUP BY
. का उपयोग करना चाहिए इसके समान:
GROUP BY d.testId, d.rowId
जब भी आप एक समग्र फ़ंक्शन का उपयोग कर रहे हों और आपके चयन में अन्य कॉलम हों, तो उन्हें समूह में होना चाहिए। तो आपकी पूरी क्वेरी होनी चाहिए:
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
ध्यान दें, जबकि आपकी वास्तविक डेटा संरचना आपके मूल प्रश्न में प्रस्तुत नहीं की गई है। ऐसा प्रतीत होता है कि इसे निम्नलिखित में समेकित किया जा सकता है:
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
देखें SQL Fiddle with Demo
. यह परिणाम देता है केवल एक data
में शामिल होने के साथ टेबल:
| 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 |