2011-02-20 43 views
7

Tôi có trường varchar là mã chữ cái và được tăng tự động (thủ công), vì vậy sau A là B cho đến sau khi Z trở thành AA và cứ thế.Tìm tối đa trong mysql khi cột là varchar

Vấn đề của tôi là khi tôi nhấn AA và tôi cố gắng chọn MAX của lĩnh vực này:

SELECT MAX(letter) from jobs 

Returns Z thay vì AA. Điều này là chính xác nếu bạn đang đặt hàng tên, nhưng tôi có một mã. Có một cách để có được quyền này?

Trả lời

2

Điều này có thể hữu ích? Sắp xếp chúng theo chiều dài trước, sau đó bằng chữ cái.

SELECT letter FROM jobs 
ORDER BY LENGTH(letter) DESC, letter DESC 
LIMIT 0, 1 
+0

Điều đó vẫn sẽ cấp Z cho bộ đầu vào [A..Z, AA]. – paxdiablo

+0

Xin lỗi, chỉnh sửa sau khi tôi nhận ra rằng tôi đã ngu ngốc vì không đọc chính xác. – jocull

8

Hãy thử cái này. Điều này sẽ buộc nó để cân chuỗi dài như là cao hơn so với chuỗi ngắn hơn:

SELECT letter 
FROM jobs 
ORDER BY LENGTH(letter) DESC, letter DESC 
LIMIT 1; 

Edit: Yup, quên để sắp xếp DESC để có được những MAX ...

+0

+1, tốt hơn giải pháp truy vấn con của tôi. Một điều cần lưu ý nếu bạn muốn tránh kẻ giết hiệu suất của các hàm trên hàng là có một cột khác (được lập chỉ mục) được gọi là letter_len được điền bằng trình kích hoạt chèn/cập nhật, sau đó sử dụng nó theo mệnh đề theo thứ tự. Điều đó sẽ khấu hao chi phí tính toán (được thực hiện khi dữ liệu thay đổi) trên tất cả các lần đọc, tăng tốc đáng kể các truy vấn. – paxdiablo

+0

Nó hoạt động. Cảm ơn nhiều. –

1

Vì bạn sau khi max của dài nhất trường, tôi sẽ bắt đầu với một cái gì đó như sau. Tôi không chắc liệu cú pháp có đúng không. Về cơ bản bạn phải bỏ qua tất cả nhưng giá trị cột dài nhất.

select max(letter) from jobs 
where len(letter) = (
    select max(len(letter)) from jobs 
) 

Dù giải pháp mà bạn chọn, xem xét các tùy chọn thêm một cột để giữ độ dài thư và có nó được kiểm soát bởi một chèn/cập nhật cò (giả MySQL đó).

Bằng cách lập chỉ mục cột đó, bạn có thể tăng tốc đáng kể truy vấn của mình kể từ khi bạn xóa các hàm trên mỗi hàng trong thời gian select. Thời điểm thích hợp để chịu chi phí là khi dữ liệu thay đổi để chi phí tính toán được khấu hao theo tất cả các lần đọc.

Điều này sẽ không hoạt động trong trường hợp cơ sở dữ liệu được viết thường xuyên hơn đọc, nhưng chúng tương đối hiếm trong kinh nghiệm của tôi.

0

Bạn có độ dài tối đa cho trường của mình không? Nếu vậy, bạn cũng có thể dạ dày phải biện minh cho dữ liệu trong lĩnh vực đó? Cơ hội là các câu trả lời là (1) theo kinh nghiệm 'có', và 5 có thể là độ dài trên, và (2) không thực sự. Tuy nhiên, là bạn có thể nói 'yes' cho cả hai, sau đó bạn sẽ có thể sử dụng điều này (nơi các hộp là khoảng trống):

  • '☐☐☐☐A'
  • ...
  • '☐☐☐☐Z'
  • '☐☐☐AA'
  • '☐☐☐AB'
  • ...
  • '☐☐☐BA'
  • ...
  • '☐☐☐ZZ'
  • '☐☐AAA'

Thực tế, đó có lẽ sẽ không được bật đèn xanh cho bạn, và do đó nó sẽ không giúp đỡ.

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