Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Chạy nhiều truy vấn trong MySQL mà không sử dụng truy vấn phụ

Nó không hoạt động như bạn nghĩ và tài liệu giải thích ý nghĩa của DISTINCT :đó là về hàng riêng biệt :

(nguồn: http://dev.mysql.com /doc/refman/5.7/en/select.html )

Bạn cần phải nhóm các hàng theo người dùng để có được một hàng cho mỗi người dùng nhưng rất tiếc, bạn không thể lấy điểm gần đây nhất của họ theo cách này. Kiểm tra danh sách GROUP BY tổng hợp các chức năng .

Truy vấn

Đây là truy vấn nhận các giá trị bạn cần:

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

Cách hoạt động

Nó tham gia bảng người dùng (bí danh là u ) với lần thử (bí danh là la , viết tắt của "nỗ lực cuối cùng") bằng cách sử dụng emailaddress làm cột đối sánh. Đó là phép nối bạn đã có trong truy vấn của mình, tôi đã thêm các bí danh vì chúng giúp bạn viết ít hơn kể từ thời điểm đó.

Tiếp theo, nó tham gia các lần thử bảng lại (bí danh là mr từ " gần đây hơn so với lần thử cuối cùng "). Nó khớp với mỗi lần thử từ la với tất cả các nỗ lực từ mr của cùng một người dùng (được xác định bởi địa chỉ email của họ ) datetime gần đây hơn . THAM GIA TRÁI đảm bảo rằng mỗi hàng từ la khớp với ít nhất một hàng từ mr . Các hàng từ la không khớp trong mr là các hàng có giá trị lớn nhất của datetime cho mỗi địa chỉ email . Chúng được khớp với các hàng đầy NULL (cho mr phần).

Cuối cùng, WHERE mệnh đề chỉ giữ các hàng có NULL trong datetime cột của hàng được chọn từ mr . Đây là các hàng khớp với các mục nhập gần đây nhất từ ​​ la cho mỗi giá trị của emailaddress .

Nhận xét về hiệu suất

Để chạy nhanh truy vấn này ( bất kỳ truy vấn nào! ) cần chỉ mục trên các cột được sử dụng trong JOIN , WHERE , GROUP BY ĐẶT HÀNG THEO mệnh đề.

Bạn không nên sử dụng emailaddress trong bảng lần thử để xác định người dùng. Bạn phải có PK (khóa chính) trên người dùng và sử dụng nó như một FK (khóa ngoại) trong lần thử (và các bảng khác tham chiếu đến một người dùng). Nếu emailaddress PK trong bảng người dùng thay đổi nó thành một CHỈ SỐ DUY NHẤT và sử dụng INTEGER AUTO INCREMENT mới cột ed userId dưới dạng PK thay vì. Chỉ mục trên cột số nhanh hơn và sử dụng ít không gian hơn chỉ mục trên cột chuỗi.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL - Mô hình danh sách gần kề - Nhận độ sâu

  2. Sao chép các hàng từ bảng này sang bảng khác bằng cách sử dụng truy vấn CHÈN

  3. Sử dụng Cơ sở dữ liệu quan hệ MySQL trên Gentoo

  4. Tìm kiếm MySQL với các ký tự đại diện có thứ tự và trích xuất giá trị của chúng

  5. MySQL cách nối các bảng trên hai trường