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

テーブル結合SQLtoRailsアクティブレコードクエリ

    Reviewの間に関連付けがある場合 およびAudio 次に、このようなもの:

    revs = Review.joins(:audios)
                 .group('style_id')
                 .select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')
    

    Reviewのリストが表示されます revsのインスタンス これらのインスタンスには、追加のavg_col1があります。 およびavg_col2 平均と通常のstyleにアクセスするためのメソッド / style_id メソッドですが、Reviewする他の列アクセサメソッド 通常、オファーは例外を発生させます。

    アソシエーションを設定していない場合は、手動でJOINを実行できます:

    revs = Review.joins('join audios on reviews.consumer_id = audios.consumer_id')
                 .group('style_id')
                 .select('style_id, avg(col1) as avg_col1, avg(col2) as avg_col2')
    

    必要なのがすべてのActiveRecordラッピングとオーバーヘッドのない生データだけである場合は、生のSQLを実行し、 select_rows

    Review.connection.select_rows(%q{
        select r.style_id, avg(a.col1), avg(a.col2')
        from reviews r
        join audios  a on r.consumer_id = a.consumer_id
        group by r.style_id
    }).map do
      { :style_id => r.shift, :avg_col1 => r.shift.to_f, :avg_col2 => r.shift.to_f }
    end
    

    それはあなたにハッシュの配列を与えるでしょう。 Structを使用して、このアプローチを単純化することもできます。 単純なデータラッパークラスを作成するには:

    c    = Struct.new(:style_id, :avg_col1, :avg_col2)
    revs = Review.connection.select_rows(%q{...}).map do |r|
      c.new(r.shift, r.shift.to_f, r.shift.to_f)
    end
    

    PS:SQLで暗黙的な結合条件を使用しないでください。これは、外積を生成するための迅速で簡単な方法です。明示的な結合条件を使用してください:

    SELECT ...
      FROM reviews JOIN audios ON reviews.consumer_id = audios.consumer_id
     GROUP BY style_id
    



    1. MySQLでのLOCATE()関数のしくみ

    2. postgresで行われたクエリの履歴を取得することは可能ですか?

    3. OracleからCrystalReportへの呼び出し手順

    4. json_extractを使用したMySQLLIKE