sql >> Database >  >> RDS >> Mysql

Gegevens uit tabel filteren en groeperen met sleutel/waarde-paren

Een deel van uw probleem is dat u een aggregatiefunctie in de SELECT-lijst gebruikt, maar geen GROUP BY . Je zou een GROUP BY . moeten gebruiken vergelijkbaar met dit:

GROUP BY d.testId, d.rowId

Telkens wanneer u een aggregatiefunctie gebruikt en u andere kolommen in uw selectie hebt, moeten deze in een groep staan ​​op. Uw volledige vraag zou dus moeten zijn:

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

Let op, terwijl uw werkelijke gegevensstructuur niet wordt weergegeven in uw oorspronkelijke vraag. Het lijkt erop dat dit kan worden geconsolideerd tot het volgende:

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

Zie SQL Fiddle met demo . Dit geeft het resultaat met slechts één join naar de data tafel:

| 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 |



  1. MySQL Select:WHERE (time now) =TUSSEN tabelwaarde EN tabelwaarde

  2. Zijn PostgreSQL-functies transactioneel?

  3. Wat zouden goede manieren kunnen zijn om ASP.Net-webapplicaties te implementeren?

  4. hoe mysql-subquery in yii CDbCriteria te converteren?