PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Tabel bergabung dengan sql ke rel permintaan rekaman aktif

Jika Anda memiliki hubungan antara Review dan Audio lalu seperti ini:

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

Itu akan memberikan daftar Review contoh di revs dan instance tersebut akan memiliki avg_col1 tambahan dan avg_col2 metode untuk mengakses rata-rata serta style biasa /style_id tetapi metode pengakses kolom lain yang Review biasanya akan menawarkan akan menimbulkan pengecualian.

Jika Anda belum mengatur asosiasi, Anda dapat melakukan JOIN secara manual:

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')

Jika yang Anda butuhkan hanyalah data mentah tanpa semua pembungkus dan overhead ActiveRecord, maka Anda dapat menjalankan SQL mentah dan hashify dengan tangan menggunakan 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

Itu akan memberi Anda Array Hash. Anda bahkan dapat menyederhanakan pendekatan tersebut menggunakan Struct untuk membuat kelas pembungkus data sederhana:

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:Jangan gunakan kondisi gabungan implisit SQL Anda, itu hanya cara cepat dan mudah untuk menghasilkan produk silang, gunakan kondisi gabungan eksplisit:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ketika saya menjalankan test case saya mendapatkan kesalahan ini:psycopg2.OperationalError:cursor _django_curs_140351416325888_23 not existing

  2. Perbarui pernyataan menggunakan klausa WHERE yang berisi kolom dengan Nilai nol

  3. Perbaiki "INSERT memiliki lebih banyak ekspresi daripada kolom target" di PostgreSQL

  4. Perbedaan antara tipe data DECIMAL dan NUMERIC di PSQL

  5. JPA 2.1 StoredProcedureQuery dengan PostgreSQL dan REF_CURSORs