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

MySQL LEFT JOIN menggunakan MAX &GROUP BY pada tabel yang digabungkan?

Masalah "per grup terbaru" sangat umum di SQL. Ada banyak contoh solusi untuk masalah ini di situs ini saja.

Jika stempel waktu Anda unik untuk setiap aktivitas anggota:

SELECT
  m.id,
  m.name,
  a.code activity_code,
  a.timestamp activity_timestamp,
  a.description activity_description
FROM
  members m
  INNER JOIN activities a ON a.member_id = m.id
WHERE
  a.timestamp = (SELECT MAX(timestamp) FROM activities WHERE member_id = m.id)

sebagai alternatif, jika ID aktivitas Anda meningkat secara monoton seiring waktu:

  ...
WHERE
  a.id = (SELECT MAX(id) FROM activities WHERE member_id = m.id)

Anda tidak perlu mengelompokkan. Tetapi kueri akan mendapat manfaat dari indeks pada activities lebih dari (member_id, timestamp) atau (member_id, id) , masing-masing.

EDIT

Untuk menampilkan anggota yang belum mencatat aktivitas, gunakan gabung kiri seperti ini.

SELECT
  m.id,
  m.name,
  a.code activity_code,
  a.timestamp activity_timestamp,
  a.description activity_description
FROM
  members m
  LEFT JOIN activities a ON 
    a.member_id = m.id
    AND a.timestamp = (SELECT MAX(timestamp) FROM activities WHERE member_id = m.id)

Perhatikan bahwa tidak ada WHERE ayat. Secara semantik, WHERE diterapkan setelah bergabung dilakukan. Jadi, klausa WHERE akan menghapus baris yang ditambahkan LEFT JOIN, yang secara efektif memberikan hasil yang sama dengan INNER JOIN asli.

Tetapi jika Anda menerapkan predikat tambahan tepat dalam kondisi bergabung, LEFT JOIN akan berfungsi seperti yang diharapkan.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara terbaik untuk mengimplementasikan Klien <-> Server <-> Arsitektur basis data dalam aplikasi Android?

  2. MySQL Workbench mengambil... -- tidak dapat menelusuri DB

  3. mysql -> masukkan ke tbl (pilih dari tabel lain) dan beberapa nilai default

  4. SQL menggabungkan hasil menjadi objek di codeigniter

  5. Bagaimana cara mengatasi nama kolom yang ambigu saat mengambil hasil?