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

Rails 3.1 dengan PostgreSQL:GROUP BY harus digunakan dalam fungsi agregat

sql yang dihasilkan oleh ekspresi bukanlah kueri yang valid, Anda mengelompokkan berdasarkan user_id dan memilih banyak bidang lain berdasarkan itu tetapi tidak memberi tahu DB bagaimana seharusnya menggabungkan file lainnya. Misalnya, jika data Anda terlihat seperti ini:

a  | b
---|---
1  | 1
1  | 2
2  | 3

Sekarang ketika Anda meminta db untuk mengelompokkan dengan a dan juga mengembalikan b, ia tidak tahu cara menggabungkan nilai 1,2 . Anda perlu memberi tahu apakah perlu memilih min, maks, rata-rata, jumlah atau yang lainnya. Saat saya sedang menulis jawabannya, ada dua jawaban yang mungkin menjelaskan semua ini dengan lebih baik.

Dalam kasus penggunaan Anda, saya pikir Anda tidak ingin grup pada level db. Karena hanya ada 10 seni, Anda dapat mengelompokkannya dalam aplikasi Anda. Jangan gunakan metode ini dengan ribuan seni:

 arts = Art.all(:order => "created_at desc", :limit => 10)
 grouped_arts = arts.group_by {|art| art.user_id}
 # now you have a hash with following structure in grouped_arts
 # { 
 #    user_id1 => [art1, art4],
 #    user_id2 => [art3],
 #    user_id3 => [art5],
 #    ....
 # }

EDIT: Pilih recent_arts, tetapi hanya satu seni per pengguna

Hanya untuk memberi Anda gambaran tentang sql (belum mengujinya karena saya tidak menginstal RDBMS di sistem saya)

SELECT arts.* FROM arts
WHERE (arts.user_id, arts.created_at) IN 
  (SELECT user_id, MAX(created_at) FROM arts
     GROUP BY user_id
     ORDER BY MAX(created_at) DESC
     LIMIT 10)
ORDER BY created_at DESC
LIMIT 10

Solusi ini didasarkan pada asumsi praktis, bahwa tidak ada dua seni untuk pengguna yang sama dapat memiliki create_at tertinggi yang sama, tetapi mungkin salah jika Anda mengimpor atau membuat sebagian besar seni secara terprogram. Jika asumsi tidak benar, sql mungkin menjadi lebih dibuat-buat.

EDIT: Coba ubah kueri menjadi Arel:

Art.where("(arts.user_id, arts.created_at) IN 
             (SELECT user_id, MAX(created_at) FROM arts
                GROUP BY user_id
                ORDER BY MAX(created_at) DESC
                LIMIT 10)").
    order("created_at DESC").
    page(params[:page]).
    per(params[:per])


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSql:Mendapatkan stempel waktu berformat aneh dengan zona waktu

  2. Bagaimana cara menginstal luasql di Linux Ubuntu 16?

  3. Baca jumlah pada tabel postgres

  4. Bagaimana saya bisa mengonfigurasi PostgreSQL untuk menggunakan Otentikasi Windows?

  5. pilih nilai maks dan min setiap x jumlah baris-postgresql