Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

DISTINCT ON query w/ ORDER BY nilai maksimal kolom

Itu akan sederhana. Anda tidak perlu max() atau DISTINCT untuk ini:

SELECT *
FROM   profile_visits
WHERE  social_user_id = 21
AND    created_at > (now() - interval '2 months')
AND    visitor_id <> 21  -- ??
ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT  6;

Saya menduga pertanyaan Anda tidak lengkap. Jika Anda ingin:
6 pengunjung terbaru dengan kunjungan terakhir mereka ke halaman
maka Anda memerlukan subquery. Anda tidak bisa mendapatkan urutan pengurutan ini dalam satu tingkat kueri, juga dengan DISTINCT ON , atau dengan fungsi jendela:

SELECT *
FROM  (
   SELECT DISTINCT ON (visitor_id) *
   FROM   profile_visits
   WHERE  social_user_id = 21
   AND    created_at > (now() - interval '2 months')
   AND    visitor_id <> 21  -- ??
   ORDER  BY visitor_id, created_at DESC NULLS LAST, id DESC NULLS LAST
   ) sub
ORDER  BY created_at DESC NULLS LAST, id DESC NULLS LAST
LIMIT  6;

Subkueri sub mendapat kunjungan terakhir per pengguna (tetapi tidak lebih dari dua bulan dan bukan untuk pengunjung tertentu21 . ORDER BY harus memiliki kolom utama yang sama dengan DISTINCT ON .

Anda memerlukan kueri luar untuk mendapatkan 6 pengunjung terbaru.
Pertimbangkan urutan acara:

Mengapa NULLS LAST ? Yang pasti, Anda tidak memberikan definisi tabel.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Performa mysql BIGINT dibandingkan dengan INT

  2. Apa arti sebenarnya dari max_connections?

  3. MySQL Socket menolak koneksi setelah ribuan koneksi berturut-turut

  4. SQL UNION ALL untuk menghilangkan duplikat

  5. Cara terbaik untuk terhubung ke MySQL dengan PHP dengan aman