2008-12-11 32 views
9

Tôi đã có một bảng, gọi faq_questions với cấu trúc sau:MySql Query, chọn lớn hơn

id int not_null auto_increment, 
question varchar(255), 
sort_order int 

Tôi đang cố gắng để xây dựng một truy vấn mà đưa ra một thứ tự sắp xếp, lựa chọn hàng với tiếp theo thứ tự sắp xếp cao nhất.

Ví dụ:

id question    sort_order 
1 'This is question 1' 10 
2 'This is question 2' 9 
3 'This is another'  8 
4 'This is another one' 5 
5 'This is yet another' 4 

Ok, vậy tưởng tượng tôi vượt qua trong 5 cho đơn đặt hàng của tôi được biết đến loại (id 4), tôi cần nó để trả lại hàng với id 3. Kể từ khi không có đảm bảo rằng SORT_ORDER sẽ tiếp giáp Tôi không thể chỉ chọn known_sort_order + 1.

Cảm ơn!

Trả lời

21

Có vẻ như quá đơn giản, nhưng có vẻ như những gì bạn cần:

SELECT id,question FROM `questions` 
WHERE `sort_order` > sort_order_variable 
ORDER BY sort_order ASC 
LIMIT 1 
+0

Hãy chắc chắn để ORDER BY SORT_ORDER DESC nếu không bạn sẽ nhận được kết quả kỳ lạ –

+1

ASC, vì ông muốn các mục nhập thấp nhất tiếp theo –

+0

Rất tiếc, tôi thấy ID = 3 và nghĩ rằng ông có nghĩa là SORT_ORDER = 3 . Bạn nhận được nó: D –

2

Bạn có thể làm điều đó với TOP hoặc LIMIT:

SELECT TOP 1 * FROM faq_questions 
WHERE sort_order > 5 
ORDER BY sort_order ASC 

nhưng đó không phải là thanh lịch hoặc di động như

SELECT * 
FROM faq_questions AS f1 
LEFT JOIN faq_questions AS f2 
    ON f1.sort_order > f2.sort_order 
    AND f2.sort_order = 5 
LEFT JOIN faq_questions AS f3 
    ON f3.sort_order BETWEEN f1.sort_order AND f2.sort_order 
WHERE f3.id IS NULL 
+0

"TOP N" là tính năng không chuẩn của Microsoft/Sybase. MySQL không hỗ trợ nó. –

+0

Phải, đó là lý do tại sao tôi đặt LIMIT (vì tôi không nhận thấy tiêu đề, nơi duy nhất mà MySQL được xác định.) :) GIỚI HẠN một tiêu chuẩn SQL? – dkretz

+0

Không, LIMIT là SQL không chuẩn. Theo như tôi biết, nó chỉ được hỗ trợ bởi MySQL/PostgreSQL/SQLite. –

0
SELECT 
    id, question, sort_order 
FROM faq_questions 
WHERE sort_order in 
(SELECT 
     MIN(sort_order) 
    FROM faq_questions 
    WHERE sort_order > ?); 

Đó dường như làm việc

+0

Vâng, nó hoạt động. Bạn cũng có thể sử dụng = thay vì IN, vì truy vấn con trả về một giá trị duy nhất. –

+0

Cảm ơn, bộ não của tôi dường như đã bị phá vỡ hôm nay, haha –

3
SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1 
Các vấn đề liên quan