sql >> Database >  >> RDS >> PostgreSQL

Elegante PostgreSQL-groep door voor Ruby on Rails / ActiveRecord

De PostgreSQL-functie die u hier wilt gebruiken, is DISTINCT ON . Er zijn twee basismanieren om deze query te maken via ActiveRecord.

De eerste methode is om gewoon de :select . te specificeren en :order opties. Dit werkt prima als je een vrij eenvoudige vraag hebt zonder :joins of :include .

Post.all(
  :select => 'DISTINCT ON (date::date) *',
  :order => 'date::date DESC, created_at DESC'
)

Als u een complexere query heeft waarbij ActiveRecord zijn eigen SELECT . genereert clausule, kunt u een subquery gebruiken om de doelrecords te selecteren.

Post.all(
  :joins => 'INNER JOIN (SELECT DISTINCT ON (date::date) id FROM posts ORDER BY date::date DESC, created_at DESC) x ON x.id = posts.id'
)

Houd er rekening mee dat dit een stuk langzamer kan zijn dan de eerste methode, afhankelijk van uw gegevens. Ik zou deze methode alleen gebruiken als dat nodig is. Zorg ervoor dat u benchmarkt met productie-achtige gegevens.



  1. Is het mogelijk om toegang te krijgen tot velden in een samengevoegde tabel in Vapor?

  2. Is mysql_insert_id thread veilig?

  3. Een geheel getal converteren naar Enum in PostgreSQL

  4. Postgres maakt POSTGIS-extensiefout met CentOS 6