2009-02-26 31 views
8

Tôi có một trật tự quy định tại khoản trông giống như:Sử dụng biểu thức boolean để quy định tại khoản

(user_id <> ?), rating DESC, title 

ở đâu? được thay thế bằng id của người dùng hiện tại.

Ngày postgresql điều này mang lại cho tôi thứ tự tôi đang tìm kiếm tức là bởi người dùng hiện tại, sau đó xếp hạng cao nhất, sau đó là tiêu đề (theo thứ tự bảng chữ cái).

Tuy nhiên trên MySQL, tôi nhận được một người dùng hiện tại không rõ ràng không phải là lần đầu tiên cũng không phải là cuối cùng, cũng không phải theo xếp hạng hoặc tiêu đề.

Là lựa chọn duy nhất của tôi về khả năng tương thích cơ sở dữ liệu chéo để thay thế biểu thức boolean nhanh và dơ bẩn này bằng TRƯỜNG HỢP KHI NÀO .. THÌ .. ELSE .. END statement?

Chỉnh sửa: Cảm ơn tất cả vì sự trợ giúp, nó được chỉ ra một cách chính xác bởi Chaos và Chad Birch trong trường hợp vấn đề nằm ở nơi khác (cụ thể là tôi đang sử dụng kết quả của truy vấn trên làm đầu vào tiếp theo) sau đó hành động ngạc nhiên rằng thứ tự đầu tiên bị mất;)

+0

Điều này sẽ hoạt động tốt, tôi sẽ tìm một vấn đề khác có thể gây ra sự cố. Thêm "(user_id <>?)" Vào mệnh đề SELECT nếu bạn muốn xác nhận rằng nó đưa ra các giá trị đúng (phải là 0 cho người dùng hiện tại, 1 khác) –

Trả lời

1

Tôi đã thử nghiệm một vài biến thể trong mysql và tất cả chúng hoạt động chính xác (theo cách bạn mong đợi). Tôi cho rằng vấn đề của bạn phải ở đâu đó ngoài truy vấn. Để xác minh cho chính mình, tôi đề nghị chạy một truy vấn tương đương trực tiếp từ máy khách mysql.

3

Bạn có thể thử làm một

select (user_id <> ?), user_id 

để thấy rằng bạn đang nhận được đúng/giá trị sai ngay hiển thị.

10

MySQL không có thực khái niệm về dữ liệu boolean, và chỉ đơn giản là bản đồ TRUEFALSE để các giá trị số 10 repectively.

Trong trường hợp này user_id <> ? sẽ trả về 0 cho phần lớn các hàng trong bảng của bạn và 1 cho các hàng khác. Thứ tự sắp xếp mặc định là ASC, có nghĩa là tất cả các hàng bạn muốn có tại số dưới cùng trong tập hợp kết quả của bạn (0/FALSE đến trước1/TRUE). Hãy thử sửa đổi truy vấn của bạn để phù hợp với điều này.

(user_id <> ?) DESC, rating DESC, title 

Giả sử đây thực sự là vấn đề, khả năng tương thích của cơ sở dữ liệu chéo có thể đạt được một cách dễ dàng.

IF(user = ?, 0, 1), rating DESC, title 
+0

Tôi nên chỉ ra rằng tôi không quen thuộc với hương vị đặc biệt của PostgreSQL SQL. Tôi đã giả định sự tồn tại của một hàm IF() đơn giản như trường hợp với MySQL, nhưng nếu nó không tồn tại, tôi xin lỗi và sẽ để lại các chỉnh sửa thích hợp như một bài tập cho người đọc :) –

+0

Nó không tồn tại, nhưng đơn giản bằng cách sử dụng '(biểu thức boolean) DESC' như trong ví dụ đầu tiên của bạn hoạt động. – JacobEvelyn

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