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

Menjalankan banyak kueri di MySQL tanpa menggunakan sub-kueri

Ini tidak berfungsi sebagaimana mestinya dan dokumentasi menjelaskan arti dari DISTINCT :ini tentang baris yang berbeda :

(sumber:http://dev.mysql.com /doc/refman/5.7/en/select.html )

Anda perlu mengelompokkan baris berdasarkan pengguna untuk mendapatkan satu baris untuk setiap pengguna, tetapi sayangnya, Anda tidak dapat memperoleh skor terbaru mereka dengan cara ini. Anda bisa mendapatkan skor maksimum, minimum, rata-rata, dan nilai komputasi lainnya. Periksa daftar GROUP BY fungsi agregat .

Kueri

Ini adalah kueri yang mendapatkan nilai yang Anda butuhkan:

SELECT u.fsname, u.emailaddress, la.score 
FROM users u
INNER JOIN attempts la                # 'la' from 'last attempt'
    ON u.emailaddress = la.emailaddress
LEFT JOIN attempts mr                 # 'mr' from 'more recent' (than last attempt)
    ON la.emailaddress = mr.emailaddress AND la.datetime < mr.datetime
WHERE mr.datetime IS NULL

Cara kerjanya

Ini bergabung dengan tabel users (alias sebagai u ) dengan tabel attempts (alias sebagai la , kependekan dari "percobaan terakhir") menggunakan emailaddress sebagai kolom yang cocok. Ini adalah gabungan yang sudah Anda miliki dalam kueri Anda, saya menambahkan alias karena mereka membantu Anda menulis lebih sedikit sejak saat itu.

Selanjutnya, ia bergabung dengan attempts tabel lagi (alias sebagai mr dari "lebih baru daripada upaya terakhir"). Ini cocok dengan setiap upaya dari la dengan semua upaya dari mr dari pengguna yang sama (diidentifikasi dengan emailaddress ) dan yang memiliki datetime yang lebih baru . LEFT JOIN memastikan bahwa setiap baris dari la cocok dengan setidaknya satu baris dari mr . Baris dari la yang tidak memiliki kecocokan di mr adalah baris yang memiliki nilai datetime biggest terbesar untuk setiap emailaddress . Mereka dicocokkan dengan baris yang penuh dengan NULL (untuk mr bagian).

Terakhir, WHERE klausa hanya menyimpan baris yang memiliki NULL di datetime kolom dari baris yang dipilih dari mr . Ini adalah baris yang cocok dengan entri terbaru dari la untuk setiap nilai emailaddress .

Komentar kinerja

Untuk menjalankan kueri ini dengan cepat (kueri apa pun! ) membutuhkan indeks pada kolom yang digunakan dalam JOIN , WHERE , GROUP BY dan ORDER BY klausa.

Anda tidak boleh menggunakan emailaddress dalam tabel attempts untuk mengidentifikasi pengguna. Anda harus memiliki PK (kunci utama) pada tabel users dan gunakan itu sebagai FK (kunci asing) di tabel attempts (dan tabel lain yang merujuk ke pengguna). Jika emailaddress adalah PK tabel users ubah ke UNIQUE INDEX dan gunakan INTEGER AUTO INCREMENT baru ed kolom userId sebagai PK alih-alih. Indeks pada kolom numerik lebih cepat dan menggunakan lebih sedikit ruang daripada indeks pada kolom string.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. nvl() berfungsi dalam file php

  2. bagaimana cara menyimpan tipe tanggal Java ke tipe tanggal mysql?

  3. MySQL:Tidak dapat membuat/menulis ke file '/tmp/#sql_3c6_0.MYI' (Errcode:2) - Apa artinya?

  4. Contoh UTC_TIME – MySQL

  5. MySQL 5.5 &5.6 nilai default