2010-04-29 161 views

Respuesta

9

¿Qué tal algo como:

select 'first', f1, f2, f3, f4 from tbl 
    order by f1 asc, f2 asc 
    limit 1 
union all 
select 'last', f1, f2, f3, f4 from tbl 
    order by f1 desc, f2 desc 
    limit 1 

Obviamente agrega a cualquier condición que desee en una cláusula where pero la premisa básica de la order by es invertir el orden de las dos secciones select.

La cláusula limit obtendrá la primera fila en ambos casos. Esa es la última fila de del conjunto en el segundo select debido al hecho de que ha invertido el orden.

Si solo hay una fila como resultado de sus condiciones y no desea que se devuelva dos veces, utilice union en lugar de union all.

+0

¿Qué pasa con los paréntesis? –

+1

@ Alexander, sí, los paréntesis son muy agradables, y tienen un flujo suave sobre ellos. También son muy atractivos si están equilibrados correctamente. Sin embargo, en realidad no son necesarios para que mi respuesta funcione, así que los voy a dejar fuera de la ecuación por ahora :-) – paxdiablo

+0

Sin paréntesis Obtengo una excepción 'SQLSTATE [HY000]: Error general: 1221 Uso incorrecto de UNION y ORDER BY' –

23

Primero y último tienen sentido solo cuando el resultado de la consulta se ordena en un campo (s).

Para obtener el primer registro:

select col1 from tab1 order by col1 asc limit 1; 

Para obtener el último registro:

select col1 from tab1 order by col1 desc limit 1; 
5
select * from table 
where id = (select id from tab1 order by col1 asc limit 1) or 
id = (select id from tab1 order by col1 desc limit 1); 
+0

Los puntos y coma de sus subconsultas romperán esta declaración. – dangermark

16
SELECT 
(SELECT column FROM table WHERE [condition] ORDER BY column LIMIT 1) as 'first', 
(SELECT column FROM table WHERE [condition] ORDER BY column DESC LIMIT 1) as 'last' 

Esto funcionó para mí cuando tenía que seleccionar primero y la última fecha en la serie de eventos.

-1
SELECT * FROM (
    SELECT first_name, LENGTH(first_name) FROM Employees 
    ORDER BY LENGTH(first_name) ASC 
    FETCH FIRST 1 rows ONLY) 
UNION 
SELECT * FROM (
    SELECT first_name, LENGTH(first_name) FROM Employees 
    ORDER BY LENGTH(first_name) DESC 
    FETCH FIRST 1 rows ONLY) 
ORDER BY 2 desc; 
+2

'FETCH FIRST' no es una sintaxis MySQL válida – FrankerZ

+0

@FrankerZ: Gracias por señalar. Sí, el FETCH FIRST es para Oracle Sql. –

Cuestiones relacionadas