2012-07-31 10 views
6

¿Cómo obtener más columnas de MAX(ID), MIN(ID) consulta MYSQL?Obtenga más información de una consulta MYSQL MAX (ID), MIN (ID)?

Actualmente me sale sólo dos valores: MAX(ID) & MIN(ID) de esta consulta:

SELECT MIN(ID), MAX(ID) FROM mytable WHERE mytable.series = 'white' ;

necesita para obtener algo como esto-pseudo-consulta:

SELECT column1, column2 
FROM mytable 
WHERE series = 'white' 
AND ID=Max(ID) 
'AND GET ME ALSO' 
WHERE series = 'white' 
AND ID=Min(ID);` 

debería devolver 2 filas para el columna 'serie' que es igual a 'blanco'.

Primero con column1 y column2 para ID = Min (ID). 2do con columna1 y columna2 para ID = Máx. (ID).

¿Pero cómo?

Respuesta

6

Aquí es un método que utiliza UNION:

SELECT column1, column2 
FROM mytable 
WHERE series = 'white' AND ID IN 
( 
    SELECT MIN(ID) FROM mytable WHERE series = 'white' 
    UNION 
    SELECT MAX(ID) FROM mytable WHERE series = 'white' 
) 

Para un buen desempeño añadir un índice combinado de (series, id).

O otra variación que puede tener un mejor rendimiento:

(
    SELECT column1, column2 
    FROM mytable 
    WHERE series = 'white' 
    ORDER BY ID 
    LIMIT 1 
) 
UNION 
(
    SELECT column1, column2 
    FROM mytable 
    WHERE series = 'white' 
    ORDER BY ID DESC 
    LIMIT 1 
) 

Esto también será capaz de utilizar el índice combinado de (series, id).

+0

Esto funciona, pero toma uno y treinta y nueve minutos. para un +5000 filas de datos ... ¿es eso normal? – Ash501

+1

@ Ash501: Eso no es absolutamente normal. ¿Olvidaste agregar índices? He actualizado mi respuesta para incluir una sugerencia de índice. Pero con 5000 filas creo que debería ser mucho más rápido que eso * incluso sin un índice *. ¿Su servidor de base de datos tiene poca potencia o bajo mucha carga? ¿Puede actualizar su pregunta para mencionar que el rendimiento es un problema e incluir la salida de 'SHOW CREATE TABLE ...' y el resultado de 'EXPLAIN SELECT'? –

+1

@ Ash501, eso es porque las subconsultas son lentas ya que MySQL tiene que ejecutarlas para cada fila. Su segunda solución debe ser más rápida siempre que tenga configurados los índices correctos. –

0

Es exactamente como usted dice:

SELECT 
    column1, column2 
FROM 
    mytable as m, 
    (SELECT MIN(ID) as mid, MAX(ID) as xid 
    FROM mytable WHERE mytable.series = 'white' 
    ) t 
WHERE 
    m.ID = t.mid or m.ID = t.xid; 

El seleccione paréntesis es seleccionar el interior que se puede utilizar como otra tabla.

2

Una solución más simple:

SELECT a.column1, a.column2 
FROM mytable a 
JOIN (
     SELECT MIN(ID) AS minid, MAX(ID) AS maxid 
     FROM mytable 
     WHERE series = 'white' 
     ) b ON a.ID IN (b.minid, b.maxid) 
Cuestiones relacionadas