Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > Mysql

Respuesta
 
Herramientas Desplegado
Antiguo 10-jul-2006, 02:34   #1 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
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 
__________________
:adios:
miglos está desconectado   Responder Citando
Antiguo 10-jul-2006, 16:47   #2 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
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!!
__________________
:adios:
miglos está desconectado   Responder Citando
Antiguo 11-jul-2006, 02:06   #3 (permalink)
seanchan ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 87
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.
seanchan está desconectado   Responder Citando
Antiguo 11-jul-2006, 03:14   #4 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
De acuerdo problema con version

Gracias seanchan!
te cuento que en mysql 4.1* (servidor local) la consulta funciona uy bien, , 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.
__________________
:adios:
miglos está desconectado   Responder Citando
Antiguo 11-jul-2006, 03:34   #5 (permalink)
oskarL está en el buen camino
 
Avatar de oskarL
 
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 503
En la version 4.0 de MySQL no puedes usar subconsultas, no puedes actualizarlo en tu servidor o pedir que te la actualicen?
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
oskarL está desconectado   Responder Citando
Antiguo 11-jul-2006, 03:44   #6 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
Cool

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.
__________________
:adios:
miglos está desconectado   Responder Citando
Antiguo 11-jul-2006, 04:20   #7 (permalink)
oskarL está en el buen camino
 
Avatar de oskarL
 
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 503
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?
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
oskarL está desconectado   Responder Citando
Antiguo 11-jul-2006, 04:24   #8 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
Hmmm..algo mas o menos asi???

$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..
}
__________________
:adios:
miglos está desconectado   Responder Citando
Antiguo 11-jul-2006, 04:30   #9 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
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
__________________
:adios:

Última edición por miglos; 11-jul-2006 a las 04:35.
miglos está desconectado   Responder Citando
Antiguo 11-jul-2006, 04:40   #10 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
se me ocurre ahora....

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).
__________________
:adios:

Última edición por miglos; 11-jul-2006 a las 05:17.
miglos está desconectado   Responder Citando
Antiguo 12-jul-2006, 10:23   #11 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
alguna sugerencia por favor???? o alguna explicacion de porque me muestra el dato asociado al sec(1) ???
quizas esta mal hecha mi tabla?
__________________
:adios:
miglos está desconectado   Responder Citando
Antiguo 13-jul-2006, 01:54   #12 (permalink)
oskarL está en el buen camino
 
Avatar de oskarL
 
Fecha de Ingreso: mayo-2005
Ubicación: Madrid
Mensajes: 503
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...
__________________
Solo hay 10 clases de personas, las que saben binario y las que no.
oskarL está desconectado   Responder Citando
Antiguo 13-jul-2006, 03:45   #13 (permalink)
seanchan ha deshabilitado el karma
 
Fecha de Ingreso: junio-2006
Mensajes: 87
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...
seanchan está desconectado   Responder Citando
Antiguo 19-jul-2006, 10:41   #14 (permalink)
miglos ha deshabilitado el karma
 
Avatar de miglos
 
Fecha de Ingreso: enero-2005
Ubicación: Perú
Mensajes: 213
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!!
__________________
:adios:
miglos está desconectado   Responder Citando
Respuesta
No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 00:45.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93