Query mysql ...

Cristian Gutierrez crgutier en dcc.uchile.cl
Vie Abr 15 01:02:39 CLT 2005


Ayer en la noche, tipler en gmail.com dijo:
> Que tal ..

Bien, gracias!

> ... ando necesitando un poco de ayuda para realizar un query a una db
> mysql 4.1 bajo sarge ...
>
> les cuento...
> Tengo una tabla que contiene las siguiente info: 
>
> +---------+------------+---------------+
> |    id   | fecha      | Inventario    |
> +---------+------------+---------------+
>
> [...]
>
> id: es un campo integer autoincrement
> fecha: campo date
> inventario: campo integer con valor de identificacion de lote.
>
> ... la idea es hacer un query que me de como resultado por cada nro de
> "inventario" el registro que posea la mayor "fecha" y el mayor "id",
> pq puede suceder que las fechas sean iguales (por ej en el inventario:
> 244) [...]

Dado que usas MySQL 4.1, asumi que era valido usar sub-queries. Esto
creo que arroja el resultado correcto en Postgres:

,----
| SELECT t.id, t.fecha, t.inventario
| FROM tabla t
| WHERE t.id IN (SELECT t2.id
|                FROM tabla t2
|                WHERE t2.inventario = t.inventario
|                ORDER BY fecha DESC, id DESC
|                LIMIT 1)
| ORDER BY Inventario DESC ;
| 
|  id  |   fecha    | inventario 
| -----+------------+------------
|  910 | 2005-04-15 |        245
|  876 | 2005-04-12 |        244
|  848 | 2005-04-12 |        243
|  834 | 2005-04-12 |        242
|  833 | 2005-04-12 |        241
|  832 | 2005-04-12 |        240
|  831 | 2005-04-12 |        239
| (7 rows)
`----

(Asumi tambien que interesa mas la ultima fecha por sobre el ultimo id,
de cada inventario).

Sin embargo, la misma consulta en MySQL 4.1 (Sid) muestra que las
subconsultas estan limitadas:

,----
| mysql> SELECT t.id, t.fecha, t.inventario FROM tabla t WHERE t.id IN
|        (SELECT t2.id FROM tabla t2 WHERE t2.inventario = t.inventario
|        ORDER BY fecha DESC, id DESC LIMIT 1) ORDER BY Inventario DESC ;
| 
| ERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT &
| IN/ALL/ANY/SOME subquery'
`----

Por lo que lo unico que se me ocurre ahora es que lo hagas en dos pasos,
desde un script o programa (cualquier lenguaje debiera servir):

* Recuperar la ultima fecha de cada inventario:

  ,----
  | SELECT max(fecha), inventario
  | FROM tabla
  | GROUP BY inventario
  | ORDER BY fecha DESC;
  `----

* Para cada par fecha/inventario, recuperar el ultimo id que coincide
  con ellos:

  ,----
  | SELECT id, fecha, inventario
  | FROM tabla
  | WHERE fecha = ${fecha} AND
  |       inventario = ${inventario}
  | ORDER BY id DESC
  | LIMIT 1;
  `----


Aun arriesgando guerra santa, lo tiro igual: punto para Postgres! :-)

-- 
Cristian Gutierrez			http://www.dcc.uchile.cl/~crgutier
crgutier[@]dcc.uchile.cl                        Jabber:crgutier en jabber.org

To iterate is human, to recurse, divine.



Más información sobre la lista de distribución Linux