Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lọc và nhóm dữ liệu từ bảng với các cặp khóa / giá trị

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 |



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn MySQL

  2. Phiên bản hàng trong MySQL

  3. Chọn hiệu quả bản ghi (khoảng cách) gần nhất từ ​​cơ sở dữ liệu

  4. Viết một truy vấn MySQL phức tạp

  5. Một cột cụ thể không được chèn khi lưu bản ghi