Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Memfilter dan Mengelompokkan data dari tabel dengan pasangan kunci/nilai

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 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. bagaimana cara memilih semua kolom tanpa kunci UTAMA di mysql?

  2. Menyimpan Nomor Kartu Kredit di SESI - cara mengatasinya?

  3. Bagaimana cara menggunakan MySQL DECIMAL?

  4. mysql pilih nilai baris dinamis sebagai nama kolom, kolom lain sebagai nilai

  5. Posting fungsi Javascript dan panggil skrip php