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

Làm thế nào có thể chọn tất cả các bản ghi ngoại trừ 3 bản ghi đầu tiên?

Về cơ bản, bạn cần đặt các truy vấn như vậy vào thủ tục được lưu trữ do một số hạn chế về LIMIT . Bạn không thể sử dụng các lựa chọn phụ hoặc các biến trong sql thuần túy. Trong các thủ tục được lưu trữ, bạn có thể sử dụng các biến.

Điều này hoạt động, rất tiếc, tôi không thể hiển thị nó trong sqlfiddle vì chúng dường như được hỗ trợ hạn chế cho các thủ tục được lưu trữ.

drop procedure if exists all_but_3;

delimiter //
create procedure all_but_3()
begin
   declare v_max bigint unsigned default ~0;
   select * from your_table limit 3, v_max;
end//

delimiter ;

drop procedure if exists last_3;
delimiter //
create procedure last_3()
begin
   declare v_max bigint;
   declare v_mid bigint;
   select count(*) from your_table into v_max;
   set v_mid := v_max - 3;
   select * from your_table limit v_mid, v_max;
end//

delimiter ;

call all_but_3();
call last_3();

Xây dựng trên các chỉ mục nhóm InnoDB

Sau khi thảo luận về một trong những câu trả lời khác với @fthiella, tôi đã quyết định giải thích thêm một số về cách điều này có thể hoạt động.

Một bảng sử dụng InnoDB làm công cụ sẽ luôn có một chỉ mục được phân cụm. Luôn luôn. Đó là cách dữ liệu được lưu trữ trong InnoDB và không thể tạo bảng mà không có chỉ mục nhóm theo bất kỳ cách nào.

InnoDB sẽ chọn khóa chính nếu có một hoặc chỉ mục duy nhất đầu tiên với tất cả các cột được đặt thành không rỗng. Nếu không có chỉ mục như vậy tồn tại, InnoDB sẽ tạo một cột ẩn với một id hàng. Id hàng này hoạt động tương tự như tự động tăng và nếu nó hữu ích khi nghĩ về nó như một cột vô hình với tăng tự động, tôi nghĩ điều đó là ổn.

Hơn nữa, InnoDB sẽ trả về các hàng theo chỉ mục được sử dụng. Nó sẽ luôn sử dụng một số chỉ mục (cách duy nhất để truy xuất dữ liệu là sử dụng chỉ mục phụ, chỉ mục được phân cụm hoặc kết hợp) vì vậy trong trường hợp không có chỉ mục nào được tạo rõ ràng, các hàng được chỉ mục nhóm ẩn trả về.

Điều này có nghĩa là một truy vấn chống lại một bảng không có khóa chính và không có chỉ mục duy nhất với tất cả các cột được đặt thành không rỗng và không có ORDER BY sẽ trả về các hàng theo thứ tự mà chúng được chèn vào.

Đây là trường hợp của câu hỏi này và là cơ sở cho câu trả lời của tôi và nhiều câu trả lời khác.

Tôi không có ý nói đây là một cách tốt để làm việc với dữ liệu. Dưới đây là một số điều bạn nên suy nghĩ trước khi sử dụng giải pháp này:

  • Nếu một chỉ mục có thể được sử dụng làm chỉ mục nhóm đã từng được tạo, bảng sẽ được ghi lại để sử dụng chỉ mục đó và bằng cách đó, sắp xếp dữ liệu trên đĩa. Nếu sau đó chỉ mục bị bỏ, thứ tự chèn ban đầu sẽ bị mất và không thể lấy lại được.
  • Nếu một chỉ mục được tạo, ngay cả khi nó không phải là duy nhất, nó có thể được trình tối ưu hóa chọn để sử dụng và các hàng sẽ được sắp xếp theo chỉ mục đó.

Tất cả điều này được ghi lại và đối với 5.5, đó là gạch đầu dòng thứ 3 trên trang này



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MAMP Pro mysql không thể khởi động

  2. Làm thế nào để chuyển đổi datetime của MySQL sang NSDate?

  3. GROUP_CONCAT () số hàng khi nhóm theo trường văn bản

  4. Cách tạo cơ sở dữ liệu trong MySQL

  5. Có gì mới trong ProxySQL 2.0