2010-07-16 14 views
10

Tôi có một bảng có 2 ngày - ADDDATE và UPDATEDATE.
Khi một mục được thêm vào, ADDDATE là ngày hiện tại và UPDATEDATE là 0000-00-00.Các mục đặt hàng Mysql theo mới nhất của 2 ngày

tôi cần phải ORDER BY lệnh SQL và có được ngày tốt nhất của những người 2.
Ví dụ nếu ADD = 12/1/2010 và CẬP NHẬT = 30/6/2010, NGÀY CẬP NHẬT là tốt nhất (mới nhất) .

Bạn có lời khuyên nào không?

Trả lời

18

Sử dụng GREATEST để tìm ngày mới nhất:

ORDER BY GREATEST(UPDATEDATE, ADDDATE) 
+0

Chỉ cần một mẹo cho những người đã có vấn đề tôi đã làm, Nếu bạn cần phải so sánh một dấu thời gian và một ngày MySQL, bạn cũng có thể làm ORDER BY GREATEST (ADDDATE, FROM_UNIXTIME (UPDATEDATE)) – Jdahern

9
ORDER BY IF(UPDATEDATE > ADDDATE, UPDATEDATE, ADDDATE) 
+0

Điều này hoạt động tốt hơn GREATEST khi NULL có thể và bạn muốn giá trị không null trả lại. – MD004

6

Nếu bạn muốn chắc cơ sở dữ liệu của bạn khả năng mở rộng, cách tiếp cận tốt nhất sẽ được thêm một cột mới LATESTDATE cùng với một chèn/cập nhật cò mà đặt trường đó thành trường mới nhất của hai trường ứng dụng bằng cách sử dụng, ví dụ: greatest.

Chạy các chức năng trên hàng trên các lựa chọn của bạn sẽ chậm lại rất nhanh khi bảng lớn hơn. Nếu bạn muốn hiệu suất ở lại khả thi khi bảng phát triển, loại lừa này là một mẹo phổ biến.

Về mặt kỹ thuật, vi phạm 3NF vì nó trùng lặp một trong các ngày nhưng vi phạm vẫn ổn vì lý do hiệu suất và bạn vẫn duy trì thuộc tính ACID vì trình kích hoạt quyết định rằng các cột vẫn nhất quán.

Tôi không biết cò cú pháp MySQL ra khỏi đỉnh đầu của tôi (tôi là một người đàn ông DB2 bản thân mình) nhưng tôi sẽ làm như sau:

  • Tạo cột mới, đặt nó vào một giá trị mặc định phù hợp.
  • Tạo trình kích hoạt chèn/cập nhật để đảm bảo thay đổi sẽ được phản ánh.
  • Chạm vào tất cả các hàng có truy vấn như update TBL set ADDDATE = ADDDATE để trình kích hoạt kích hoạt cho tất cả các hàng hiện tại.

Ưu điểm của giải pháp này là nó di chuyển chi phí tính toán vào thời điểm dữ liệu thay đổi, không phải mỗi lần bạn truy vấn cơ sở dữ liệu. Điều này làm tăng chi phí trên tất cả các lần đọc, làm cho nó hiệu quả hơn (trừ khi bạn là một trong những con thú rất hiếm, nơi bảng được viết thường xuyên hơn đọc).

Hãy nhớ điều này có thể không cần thiết nếu kích thước bảng của bạn tương đối nhỏ - tôi làm việc trong môi trường nơi các bảng thật sự rất lớn.

+0

nice techique.Thanks – ntan

Các vấn đề liên quan