sql >> データベース >  >> RDS >> Mysql

キーと値のペアを使用したテーブルからのデータのフィルタリングとグループ化

    問題の一部は、SELECTリストで集計関数を使用しているが、GROUP BYを使用していないことです。 。 GROUP BYを使用する必要があります これに似ています:

    GROUP BY d.testId, d.rowId
    

    集計関数を使用していて、selectに他の列がある場合は常に、それらはgroupbyに含まれている必要があります。したがって、完全なクエリは次のようになります。

    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 withDemo を参照してください。 。これにより、dataへの結合が1つだけの結果が得られます。 テーブル:

    | 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. 直接実行する場合と比較してHibernateselectのパフォーマンスが低い-どのようにデバッグしますか?

    2. デフォルトのトレースの削除–パート1

    3. OracleのCONCAT()関数

    4. データベースへの画像の挿入