2011-07-12 18 views
14

Trong cơ sở dữ liệu của tôi, tôi có một số hồ sơ, nơi tôi đang sắp xếp theo những gì sẽ xảy ra là giá trị như nhau:Làm thế nào mysql đặt mua hàng với cùng một giá trị

| col1 | timestamp    | 
| row1 | 2011-07-01 00:00:00 | 
| row2 | 2011-07-01 00:00:00 | 
| row3 | 2011-07-01 00:00:00 | 

SELECT ... ORDER BY timestamp 

Dường như kết quả là theo một thứ tự ngẫu nhiên. Thứ tự ngẫu nhiên có nhất quán không. Điều đó có nghĩa là nếu tôi có các dữ liệu này trong hai máy chủ mysql. Tôi có thể mong đợi kết quả tương tự?

Trả lời

10

Tôi khuyên bạn không nên giả định điều đó. Trong SQL chuẩn, mọi thứ không bắt buộc theo mệnh đề ORDER BY rõ ràng là phụ thuộc thực hiện.

Tôi không thể nói cho MySQL, nhưng trên ví dụ: SQL Server, thứ tự đầu ra cho các hàng "bằng" cho đến khi ORDER BY có liên quan có thể thay đổi mỗi khi truy vấn chạy - và có thể bị ảnh hưởng bởi thực tế bất cứ điều gì (ví dụ: mức gói/dịch vụ của máy chủ, khối lượng công việc, các trang hiện có trong vùng đệm, v.v.).

Vì vậy, nếu bạn cần một thứ tự cụ thể, điều tốt nhất bạn có thể làm (cả để đảm bảo và truy vấn tài khoản cho người bảo trì trong tương lai) yêu cầu rõ ràng thứ tự bạn muốn.

+4

+1 lưu ý: tìm kiếm một cột bạn có thể đặt hàng bằng cách như một đối số thứ hai để có được kết quả phù hợp – Jacob

+0

Trình tự các hàng được trả về được đảm bảo CHỈ theo mệnh đề 'ORDER BY' (hoặc trong MySQL, một' ORDER BY' được chỉ định ngầm định trong mệnh đề 'GROUP BY'.) Ngoài ra, KHÔNG CÓ BẢO ĐẢM của các hàng thứ tự sẽ được trả về Ngoài ra, MySQL được tự do trả về các hàng trong bất kỳ chuỗi nào. – spencer7593

2

Điều đó tùy thuộc vào công cụ lưu trữ được sử dụng. Trong MyISAM, chúng sẽ được sắp xếp theo trật tự tự nhiên (tức là theo thứ tự chúng được lưu trữ trên đĩa - có thể thay đổi bằng lệnh ALTER TABLE ... ORDER BY). Trong InnoDB chúng sẽ được PK đặt hàng. Các động cơ khác có thể có quy tắc riêng.

+0

Đó là InnoDB không có PK ... – atiking

+1

InnoDB luôn có PK. Nếu bạn không tạo ra một cách rõ ràng, InnoDB đã tạo ra nó là 6 byte PK riêng. – Mchl

+0

để thứ tự ngẫu nhiên không nhất quán, vì PK có thể khác nhau? – atiking

2

Trong ORDER BY condition nếu các hàng có cùng giá trị hoặc nếu bạn muốn sắp xếp dữ liệu bằng cách chọn ORDER BY statement. CASE: Bạn muốn ORDER BY các giá trị của cột là tần số của các từ. Và hai từ trong bảng có thể có cùng giá trị tần số trong cột xuất hiện tần số .. Vì vậy, trong cột tần số, bạn sẽ có hai tần số giống nhau của hai từ khác nhau. Vì vậy, trong "select * from database_name ORDER BY frequency" bạn có thể tìm thấy bất kỳ một trong hai từ có tần số giống nhau hiển thị ngay trước nó. Và trong lần thứ hai, một từ khác được hiển thị sau khi từ đầu tiên xuất hiện lúc nãy. Nó phụ thuộc vào bộ nhớ đệm, các trang được vào và ra tại thời điểm này, vv ..

6

Câu trả lời của lô đã có, nhưng câu trả lời cuối cùng là NO.

Nếu bạn muốn các hàng được trả về theo một chuỗi cụ thể, nhất quán, sau đó chỉ định rằng trong một ORDER BY. Nếu không có điều đó, hoàn toàn KHÔNG BẢO ĐẢM các hàng đơn hàng nào sẽ được trả lại.

Tôi nghĩ rằng những gì bạn có thể bị thiếu là có thể có nhiều biểu thức được liệt kê trong mệnh đề ORDER BY. Và bạn có thể bao gồm các biểu thức không có trong danh sách SELECT.

Trong trường hợp của bạn, ví dụ: bạn có thể sử dụng ORDER BY timestamp, id.

(Hoặc một số cột khác hoặc biểu thức.)

Điều đó sẽ đặt hàng các hàng đầu tiên trên dấu thời gian, và sau đó bất kỳ hàng nào có cùng giá trị cho timestamp sẽ được sắp xếp theo id, hoặc bất cứ biểu hiện tiếp theo trong này .

1

Câu trả lời là: Không, thứ tự sẽ không nhất quán. Tôi phải đối mặt với cùng một vấn đề và giải quyết bằng cách thêm một cột khác vào phần thứ tự. Hãy chắc chắn rằng cột này là duy nhất cho mỗi bản ghi như 'ID' hoặc bất cứ điều gì.

Trong trường hợp này, bạn phải thêm trường 'ID' vào bảng duy nhất cho mỗi bản ghi. Bạn có thể gán nó 'AI' (tăng tự động) để bạn không phải đối phó với việc bảo trì.

Sau khi thêm cột 'ID', cập nhật phần cuối của câu hỏi của bạn như:

SELECT mt.* 
FROM my_table mt 
ORDER BY mt.timestamp ASC, mt.id DESC 
Các vấn đề liên quan