sql >> Databáze >  >> RDS >> PostgreSQL

Tabulka join sql to rails aktivní záznam dotazu

Pokud máte spojení mezi Review a Audio pak něco takového:

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

Zobrazí se seznam Review instance v revs a tyto instance budou mít navíc avg_col1 a avg_col2 metody pro přístup k průměrům stejně jako obvyklý style /style_id kromě jiných metod přístupového objektu ke sloupci, které Review by normálně nabízel vyvolá výjimky.

Pokud nemáte nastavená přidružení, můžete JOIN provést ručně:

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

Pokud vše, co potřebujete, jsou pouze nezpracovaná data bez všech obalů ActiveRecord a režie, můžete provést nezpracované SQL a ručně je hašovat pomocí 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 by vám dalo pole hashů. Tento přístup můžete dokonce zjednodušit pomocí Struct vytvořit jednoduché třídy obalu dat:

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:Nepoužívejte implicitní podmínky spojení ve svém SQL, to je jen rychlý a snadný způsob, jak vytvářet křížové produkty, používejte explicitní podmínky spojení:

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



  1. Podmíněný příkaz JOIN SQL Server

  2. Jak zobrazit datum v německém formátu na serveru SQL (T-SQL)

  3. Jak najít součet více sloupců v tabulce v SQL Server 2005?

  4. Přejmenujte proceduru mysql