2012-09-01 11 views
6

Tengo una tabla con un esquema siguiente:MySQL - para cada ID de la lista seleccione 2 último elemento

id, field, time 
3, 'test0', 2012-08-29 
3, 'test1', 2012-08-30 
3, 'test2', 2012-08-31 
2, 'test0', 2012-08-19 
2, 'test1', 2012-08-20 
2, 'test2', 2012-08-26 
... 

que necesito para cada id en la lista parece que es pasado y anterior al último valor. Por ejemplo, si los ID = [2,3] El resultado debe volver

3, 'test1', 2012-08-30 
3, 'test2', 2012-08-31 
2, 'test1', 2012-08-20 
2, 'test2', 2012-08-26 

Si i tendrá apenas último valor, me gustaría utilizar

SELECT * 
FROM table 
WHERE id IN (2, 3) 
GROUP BY id 

Alguna idea de cómo puedo lograr esto?

+0

Group by dará un único resultado para todos los identificadores. – hjpotter92

+0

podría explotar un 'SORT' en la columna de tiempo combinado con una cláusula' LIMIT'. –

Respuesta

3

Si sus tiempos para cada número de identificación son únicos, esto funcionará.

SELECT d.id, d.field,d.time 
    FROM d d 
    JOIN (
    SELECT max(d.time)m, d.id 
     FROM d 
     JOIN (
     SELECT max(time) m, id 
      FROM d 
     GROUP BY id 
    )e ON d.id=e.id AND e.m>d.time 
     GROUP BY d.id 
    )e ON d.time >= e.m AND d.id = e.id 

Así es como funciona esto. Esta consulta anidada obtiene la última hora para cada id.

  SELECT max(time) m, id 
      FROM d 
     GROUP BY id 

Luego, a su vez, esto se anida en esta consulta, que le da el segundo a última hora para cada id (la última hora del subconjunto de filas que excluyen la última vez).

SELECT max(d.time)m, d.id 
     FROM d 
     JOIN (
     SELECT max(time) m, id 
      FROM d 
     GROUP BY id 
    )e ON d.id=e.id AND e.m > d.time 

Por último, la consulta completa (mostrado primero anteriormente) recibe todas las filas con tiempos mayores o iguales a la segunda última vez.

Si sus tiempos no son únicos, es decir, tiene algunas filas donde aparece el ID y la hora idénticos, puede obtener más de dos filas para cada ID. Pero siempre recibirás las dos últimas veces.

Si una ID en particular solo tiene una fila, no la obtendrá.

Solo usted sabe si esas limitaciones son aceptables.

Go fiddle! http://sqlfiddle.com/#!2/82719/5/0

1

seguirlo

SELECT * 
    FROM table 
    WHERE id = '1' 
    ORDER BY `id` desc 
    LIMIT 0,2 
UNION 
    SELECT * 
    FROM table 
    WHERE id = '2' 
    ORDER BY `id` desc 
    LIMIT 0,2 

ACTUALIZACIÓN:

Si también se puede intentar algo como esto:

SELECT t1.* 
FROM `tablename` t1 
LEFT OUTER JOIN `tablename` t2 
    ON (t1.id = t2.id AND t1.time > t2.time) 
GROUP BY t1.id, t1.field, c1.time 
HAVING COUNT(*) < 2; 

Reference

Cuestiones relacionadas