Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Filtrowanie i grupowanie danych z tabeli z parami klucz/wartość

Częścią twojego problemu jest to, że używasz funkcji agregującej na liście SELECT, ale nie używasz GROUP BY . Powinieneś używać GROUP BY podobny do tego:

GROUP BY d.testId, d.rowId

Za każdym razem, gdy używasz funkcji agregującej i masz w zaznaczeniu inne kolumny, powinny one znajdować się w grupie według. Twoje pełne zapytanie powinno więc wyglądać następująco:

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

Pamiętaj, że Twoja rzeczywista struktura danych nie jest przedstawiona w pierwotnym pytaniu. Wygląda na to, że można to skonsolidować w następujący sposób:

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

Zobacz Skrzypce SQL z wersją demonstracyjną . Daje to wynik tylko z jednym złączeniem do data tabela:

| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Brak pamięci (przydzielono 50855936) (próbowano przydzielić 50331646 bajtów)

  2. Ogromna tablica PHP a baza danych MySQL?

  3. Laravel zmienia parametry bazy danych w czasie wykonywania

  4. FROM_UNIXTIME() Przykłady – MySQL

  5. Dlaczego ten błąd wystąpił podczas tworzenia EVENT z instrukcją złożoną?