Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Mysql (http://www.forosdelweb.com/f86/)
-   -   Query:El ultimo dato ingresado (http://www.forosdelweb.com/f86/query-ultimo-dato-ingresado-408070/)

miglos 10/07/2006 02:34

Query:El ultimo dato ingresado
 
Saludos:
Tengo una tabla de clientes y otra de servicios donde registro los servicios prestados a determiando cliente (fecha, tipo servicio,persona que atendio, etc).
la estructura de la tabla sericios es mas o menos asi:

inst(PK) - autoincrement
idserv(INDEX)
sec
idcliente

el idserv me muestra el codigo del primer servicio que se hizo a un cliente, para este caso memuestra SEC=1, para un segundo servicio toma el mismo idserv y el SEC=2, para un tercer servicio SEC=3 y asi sucesivamente.
Lo que deseo es que para cada caso, me muestre el idinst con el ultimo servicio realizado a cada cliente, osea el max(SEC) , pero no logro obtener esa fila unicamente.

Esto es lo que estoy usando:
Código PHP:

select s.idservc.nombremax(s.sec), s.fechas.horac.direccion
from servicios s
cliente c
where s
.cliente c.idcliente
group by s
.idserv
order by s
.fecha desc 


miglos 10/07/2006 16:47

gracias rrufo, pero con eso solo sonsigo el ultimo insert a mi tabla, y lo que necesito es el ultimo insert a cada idserv...
Alguna otra sugerencia,
gracias!!

seanchan 11/07/2006 02:06

Voy a intentar darte alguna idea, en MySQL no se si se podra que llevo apenas unos días trabanjando con ella. En Oracle se podría hacer algo parecido a esto a ver si te sirve o te da alguna idea:

Código:

SELECT s.idserv, c.nombre, s.sec, s.fecha, s.hora, c.direccion
FROM servicios s, cliente c
WHERE s.cliente = c.idcliente
 AND (s.sec,s.cliente,s.idserv) in (SELECT MAX(s1.sec),s1.cliente,s1.idserv
                          FROM servicios s1
                          WHERE s1.idserv=s.idserv
                              AND s.cliente=s1.cliente
                              AND s.idserv=s1.idserv
                            GROUP BY S1.CLIENTE,s1.idserv)

Con esto se mostraría el último servicio que se ha realizado por cliente y tipo de servicio.

miglos 11/07/2006 03:14

problema con version
 
Gracias seanchan!
te cuento que en mysql 4.1* (servidor local) la consulta funciona uy bien, :arriba: , pero a la hora de subirla a mi servidor web mysql 4.0* me envia un mensaje de error:
Código PHP:

#1064 - You have an error in your SQL syntax.
  
Check the manual that corresponds to your MySQL server version for the right syntax to use near:
  
idcomercio idinst  )  IN (   SELECT MAXs1 sec 

la consulta finalmente quedo de la sgte manera, tuve que hacer algunos cambios a los nombres de las tablas y campos, pero la idea es la misma:
Código:

SELECT s.idinst, c.nombre, s.sec, s.fecha, s.h_inicio, c.direccion
FROM instalaciones s, comercios c
WHERE s.idcomercio = c.idcomercio
AND (

s.sec, s.idcomercio, s.idinst
)
IN (

SELECT MAX( s1.sec ) , s1.idcomercio, s1.idinst
FROM instalaciones s1
WHERE s1.idinst = s.idinst
AND s.idcomercio = s1.idcomercio
AND s.idinst = s1.idinst
AND s.fecha IS NOT NULL
GROUP BY S1.idcomercio, s1.idinst
)

alguna sugerencia al respecto???
De verdad te agradezco mucho por la ayuda, llevo desde la tarde dandole vueltas a este tema.

oskarL 11/07/2006 03:34

En la version 4.0 de MySQL no puedes usar subconsultas, no puedes actualizarlo en tu servidor o pedir que te la actualicen?

miglos 11/07/2006 03:44

Pues de momento lo he pedido, pero no se cuando me lo actualicen, si es que lo hacen.
Qué otra solución habria a mi consulta??? con lo que me indico seanchan funciona muy bien, pero esta el problema de la subconsulta.

oskarL 11/07/2006 04:20

miglos, no se que problema tienes... he probado el primer ejemplo que has puesto y funciona perfectamente, saca el maximo "sec" de cada grupo.

O no buscas eso? que quieres obtener?

miglos 11/07/2006 04:24

Hmmm..algo mas o menos asi??? :pensando:

$var = array--->"select distinct(idinst) from instalaciones"

foreach $var as idinst
{
select max(sec), etc..
from instalaciones, comercios
where idinst=$var

echo $row[fecha],nombre, etc..
}

miglos 11/07/2006 04:30

Asi es OskarL, eso es lo que quiero obtener.
Pero no se porqué, me muestra el max(sec) para cada grupo pero me muestra la fecha del sec(1), espero haberme explicado.
Por ejemplo:

idinst - sec - fecha
1001 - 1 - 05/06/2006
1001 - 2 - 15/06/2006
1001 - 3 - 05/07/2006
1001 - 4 - 10/07/2006

al ejecutar la consulta me bota
1001 - 4 - 05/06/2006

miglos 11/07/2006 04:40

se me ocurre ahora....:pensando:

Código HTML:

SELECT s.idinst, c.nombre, max( s.sec ) , max( s.fecha ) , s.h_inicio, c.direccion
FROM instalaciones s, comercios c
WHERE s.idcomercio = c.idcomercio
AND fecha IS NOT NULL
GROUP BY s.idinst
ORDER BY s.fecha DESC

no resulta!, es decir, muestra las ultimas fechas(en desorden), pero el resto de detalles los sigue asociando al sec(1).

miglos 12/07/2006 10:23

alguna sugerencia por favor???? o alguna explicacion de porque me muestra el dato asociado al sec(1) ???
quizas esta mal hecha mi tabla?

oskarL 13/07/2006 01:54

No es cosa de tu tabla, yo me he creado una para probar, y me pasa lo mismo (aunque tambien puede ser que hayamos cometido el mismo error al crearla, pero weno, jeje)

Le he estado dando vueltas, y creo que la unica solucion en este caso es la subconsulta...

seanchan 13/07/2006 03:45

Si no sacas el campo s.h_inicio prueba con esta a ver:
Código:

SELECT s.idinst, c.nombre, max( s.sec )  as maxSec, max( s.fecha ) as Fecha , c.direccion
FROM instalaciones s, comercios c
WHERE s.idcomercio = c.idcomercio
AND fecha IS NOT NULL
GROUP BY s.idinst, c.nombre,c.direccion
ORDER BY fecha DESC

Si no puedes actualizar la version de MySQL, puedes mirar de hacer la subconsulta la guardas en una tabla temporal y haces la otra SQL. He visto que en MySQL hay TEMPORARY TABLE, para crear tablas temporales, pero no se como se utilizan, si alguien lo ha hecho que comente algo.

Otra opción sería lanzar la subconsulta, leerla en PHP, y en base a los resultados obtenidos montar el WHERE para la segunda Consulta.

Cualquiera de estas opciones es un trabajo...

miglos 19/07/2006 10:41

Saludos!
Por motivos de viaje no pude responder inmediatamente y aclarar como quedo solucionado el tema.
Con la ultima colaboracion de seanchan, el tema quedo solucionado y todo funciona muy bien, solo me queda esperar la actualizacion de mi base de datos, imagino que en temas de rendimiento, es mejor usar las subconsultas.

Muchas gracias nuevamente!!:si:


La zona horaria es GMT -6. Ahora son las 20:43.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.