tôi muốn sắp xếp Posts
của mình bằng dtModified
(sửa đổi giờ) nếu nó không rỗng (bài sửa đổi b4), khác sắp xếp theo dtPosted
(datetime posted)SQL: làm thế nào để tôi sắp xếp theo một trường nếu nó không null khác sử dụng trường khác
Trả lời
Nó có vẻ như tôi đang đưa ra lời khuyên này ba lần một tuần ở đây trên SO, có lẽ tôi chỉ nên từ bỏ và để cho nó đi :-) Nah, tôi không nghĩ như vậy:
Don' t chức năng sử dụng cho mỗi hàng trong tính toán cột của bạn (hoặc order by
khoản) nếu bạn muốn cơ sở dữ liệu của bạn để mở rộng quy mô tốt. Bạn nên kiểm tra hiệu suất cho trường hợp của bạn đặc biệt (biện pháp, không đoán) nhưng làm phép tính khi đọc cơ sở dữ liệu nói chung sẽ ảnh hưởng đến khả năng của bạn để mở rộng (điều này sẽ không thành vấn đề đối với cơ sở dữ liệu sổ địa chỉ của bạn, nhưng các cửa hàng tôi làm việc có số lượng lớn lượng dữ liệu).
Số lượng "làm thế nào để tôi nhận được DB của tôi để đi nhanh hơn?" câu hỏi vượt xa số lượng "làm thế nào để tôi sử dụng ít không gian hơn?" những người. Đó là một con đường tốt để hy sinh không gian đĩa cho hiệu suất.
Các thời điểm thích hợp để làm các phép tính là khi thay đổi dữ liệu. Bằng cách đó, chi phí của các thay đổi được phân bổ trên tất cả các lần đọc.
Lời khuyên của tôi là tạo ra một cột như dtLastAction
để chứa các giá trị đặt hàng sau đó sử dụng một chèn/cập nhật kích hoạt để đặt nó là giống như dtModified
nếu không null, hoặc dtPosted
nếu dtModified
là null. Về mặt kỹ thuật, điều này vi phạm 3NF nhưng không sao nếu bạn biết bạn đang làm gì và các trình kích hoạt đảm bảo tính nhất quán của dữ liệu trong trường hợp đó.
Sau đó, chỉ mục trên cột dtLastAction
và xem tốc độ truy vấn của bạn được cải thiện với chi phí (ít hơn) của một số công việc phụ trong khi chèn và cập nhật. Tôi nói ít hơn bởi vì hầu hết các bảng cơ sở dữ liệu được đọc nhiều hơn so với văn bản (rõ ràng phương pháp này là vô dụng nếu tình huống cụ thể của bạn là một trong những trường hợp ngoại lệ rất hiếm).
Ngoài ra, đối với trường hợp đặc biệt này, bạn có thể thiết dtModified
và dtPosted
với giá trị tương tự khi tạo các mục nhập, có nghĩa là sẽ không bao giờ dtModified
được null. Bạn vẫn có thể phát hiện các bài đăng chưa bao giờ được sửa đổi bởi thực tế là hai giá trị datetime này giống hệt nhau.
vâng, tôi nghĩ' dtLastAction' là rất tốt. có thể kiểm tra nếu kiểm tra nếu 'dtModified' giống với' dtPosted' thậm chí còn lớn hơn. tôi không cần thêm 1 trường nữa. có thể đổi tên 'dtModified' thành' dtLastAction' sẽ làm cho nó trực quan hơn –
Nói chung tôi đồng ý với việc giảm chi phí đọc. Tuy nhiên, trường hợp cụ thể này rất đơn giản, tôi không nghĩ nó biện minh cho tất cả sự phức tạp của bộ nhớ đệm. Ví dụ. nếu hành động bị xóa thì bạn cần cập nhật ngày hành động cuối cùng cho hành động mới nhất còn lại, cơn ác mộng! – malhal
Bạn có thể sử dụng COALESCE
:
ORDER BY COALESCE(dtModified, dtPosted)
Một lựa chọn khác là sử dụng các chức năng cụ thể MySQL IFNULL
thay vì COALESCE
.
kiểm tra trên MySQL:
CREATE TABLE table1 (dtModified DATETIME NULL, dtPosted DATETIME NOT NULL);
INSERT INTO table1 (dtModified, dtPosted) VALUES
('2010-07-31 10:00:00', '2010-07-30 10:00:00'),
(NULL , '2010-07-31 09:00:00'),
('2010-07-31 08:00:00', '2010-07-30 10:00:00');
SELECT dtModified, dtPosted
FROM table1
ORDER BY COALESCE(dtModified, dtPosted)
Kết quả:
dtModified dtPosted
2010-07-31 08:00:00 2010-07-30 10:00:00
NULL 2010-07-31 09:00:00
2010-07-31 10:00:00 2010-07-30 10:00:00
bạn có thể sử dụng COALESCE trong ORDER BY không? –
Có, tôi nghĩ bạn phải sử dụng 'IFNULL' cho MySQL. –
@Daniel Vassallo: Tôi vừa thử nghiệm nó trong MySQL và nó có vẻ hoạt động tốt. Xem câu trả lời cập nhật của tôi cho SQL tôi đã sử dụng. –
Trong SELECT của bạn, sử dụng một lệnh CASE mà mất giá trị của ngày sửa đổi nếu không phải là null nếu không thì thời gian đăng tuyển. Sau đó, sử dụng cột "được tính toán" mới cho ORDER BY của bạn.
- 1. SQL Server - Sắp xếp theo trường hợp
- 2. Làm cách nào để sắp xếp theo một cột trong các trường hợp khác nhau (Oracle)
- 3. Sql Sắp xếp theo ... sử dụng `Trường hợp When` cho Tăng dần khác nhau, giảm dần, và Custom Orders
- 4. Làm cách nào để sử dụng LINQ để sắp xếp theo nhiều trường?
- 5. Cách sắp xếp LinkedHashMap theo trường giá trị của nó?
- 6. Sắp xếp theo nhiều phím sử dụng orderings khác nhau
- 7. Nếu trường là null, hãy kéo một số trường nhất định; cách khác, kéo các lĩnh vực khác
- 8. PHP Sắp xếp mảng theo trường?
- 9. Làm thế nào để sắp xếp theo hai trường (một số, một chuỗi) cùng một lúc bằng cách sử dụng chương trình "sắp xếp" được tích hợp?
- 10. Làm thế nào để sử dụng nếu tuyên bố trong trường hợp khoản trong SQL?
- 11. Cách sắp xếp trên nhiều trường có dấu tách trường khác nhau
- 12. Sắp xếp Danh sách các đối tượng theo nhiều trường
- 13. Trong MongoDB, cách lọc theo vị trí, sắp xếp theo một trường khác và phân trang kết quả chính xác?
- 14. Sắp xếp theo null/không null với ICriteria
- 15. Python: cách sắp xếp mảng ma trận theo hai trường?
- 16. Làm thế nào tôi có thể nhận TStringList để sắp xếp khác nhau trong Delphi
- 17. Làm thế nào để hướng dẫn Jackson sắp xếp một trường trong một Object thay vì Object nó?
- 18. Làm thế nào tôi có thể được thông báo nếu cột DataGrid được sắp xếp (và không sắp xếp)
- 19. SQL Sắp xếp theo Đếm
- 20. Sắp xếp các nhóm khác nhau bằng cách sử dụng các thứ tự sắp xếp khác nhau trong solr
- 21. Cách sắp xếp danh sách trong Scala theo hai trường?
- 22. Sắp xếp băm theo mảng theo thứ tự bảng chữ cái theo một trường
- 23. Làm thế nào để tránh nếu ... khác và chuyển trường hợp
- 24. greendao sắp xếp theo trường trong bảng có liên quan
- 25. Loại bỏ trường dữ liệu Java theo loại trường khác
- 26. Chọn giá trị cột nếu không null khác sử dụng giá trị cột khác
- 27. PHP usort sắp xếp nhiều trường
- 28. trường hợp chuyển đổi vs nếu khác
- 29. Sắp xếp nhiều trường trong MySQL
- 30. Làm thế nào để sử dụng ValueResolver nếu loại trường không có hàm tạo mặc định?
Sắp xếp trong thứ tự nào?Tăng hoặc giảm? –