2008-12-11 1 views
9

Tengo una tabla, llamada faq_questions con la siguiente estructura:MySQL Query, seleccione mayor que

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

Estoy tratando de construir una consulta que da un orden de búsqueda, selecciona la fila con la siguiente orden de clasificación más alto

Ejemplo:

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, por lo que se imaginan que pase en el 5 por mi orden conocida especie (id 4), lo necesito para devolver la fila con id 3. Ya que no hay garantía de que sort_order será contiguo No puedo simplemente seleccionar la orden_orden_conocida + 1.

¡Gracias!

Respuesta

21

Parece demasiado simple, pero parece que lo que necesita:

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

Asegúrese de pedir POR sort_order DESC de lo contrario obtendrá extraños resultados –

+1

ASC, ya que él quiere que la próxima entrada más bajo –

+0

Vaya, vi ID = 3 y pensé que quería decir sort_order = 3 . Lo tienes: D –

2

Usted puede hacerlo con TOP o LIMIT:

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

pero eso no es tan elegante o portátil como

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" es una función no estándar de Microsoft/Sybase. MySQL no lo admite. –

+0

Correcto, por eso puse LIMIT (ya que no noté el título, el único lugar donde se identificó MySQL). :) ¿LIMIT es un estándar SQL? – dkretz

+0

No, LIMIT es SQL no estándar. Por lo que sé, solo es compatible con 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 > ?); 

que parece funcionar

+0

Sí, eso funciona. También puede usar = en lugar de IN, ya que la subconsulta arroja un valor único. –

+0

Gracias, mi cerebro parece estar roto hoy, jaja –

3
SELECT * FROM table_name WHERE sort_order > 5 ORDER BY sort_order ASC LIMIT 1