PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Tabela łączenia sql z zapytaniem dotyczącym aktywnego rekordu szyn

Jeśli masz powiązanie między Review i Audio potem coś takiego:

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

To da listę Review instancje w revs a te instancje będą miały dodatkowy avg_col1 i avg_col2 metody dostępu do średnich, jak również zwykły style /style_id metody, ale inne metody dostępu do kolumn, które Review który normalnie zaoferuje, zgłosi wyjątki.

Jeśli nie masz skonfigurowanych powiązań, możesz wykonać DOŁĄCZ ręcznie:

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

Jeśli wszystko, czego potrzebujesz, to tylko surowe dane bez całego opakowania i narzutu ActiveRecord, możesz wykonać surowy kod SQL i zahaszować go ręcznie, używając 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

To dałoby ci tablicę haszów. Możesz nawet uprościć to podejście, używając Struct tworzenie prostych klas opakowujących dane:

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:Nie używaj niejawnych warunków złączenia w swoim SQL, to tylko szybki i łatwy sposób tworzenia produktów krzyżowych, używaj jawnych warunków złączenia:

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. Wybrać pierwszy wiersz w każdej grupie GROUP BY?

  2. Zignorowano zdalny adres URL połączenia WildFly Postgres DataSource

  3. Wiele formuł w PostgreSQL

  4. Błąd:musi być właścicielem bazy danych

  5. Jak zadeklarować tablicę typu rowtype w funkcji PostgreSQL?