Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ordenar consulta

Estas en el tema de Ordenar consulta en el foro de Mysql en Foros del Web. Tengo una tabla sencilla pero con muchos registros y la consulta me tarda mucho tiempo, y no puedo modificar los indices. Quiero saber los ultimos ...
  #1 (permalink)  
Antiguo 06/06/2009, 19:48
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 1 mes
Puntos: 0
Ordenar consulta

Tengo una tabla sencilla pero con muchos registros y la consulta me tarda mucho tiempo, y no puedo modificar los indices.

Quiero saber los ultimos 10 usuarios que se han desconectado ordenados DESC por fecha de desconexión.

La tabla clientes tiene un id, usuario, fecha_de_entrada y duracion, la consulta directa sería:

SELECT usuario, fecha_de_entrada+INTERVAL duracion SECOND AS Salida FROM clientes WHERE duracion>0 ORDER BY Salida DESC LIMIT 10

Funciona perfecta pero tarda mucho porque el único índice es el Id, si ordeno por Id DESC va muy rápida pero la consulta no es la que quiero.

Espero haberme explicado.
  #2 (permalink)  
Antiguo 07/06/2009, 10:14
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Ordenar consulta

Sin poder tocar indices.... no se lo unico que veo superfluo seria "WHERE duracion>0" quitalo a ver si ganas algo... claro que luego igual te salen los que aún no se han desconectado... de pende de cuando se cree el registro, al conectarse o al desconectarse...

Quim
  #3 (permalink)  
Antiguo 07/06/2009, 10:27
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar consulta

Esto:
Código SQL:
Ver original
  1. SELECT usuario, fecha_de_entrada+INTERVAL duracion SECOND AS Salida
  2. FROM clientes
  3. WHERE duracion>0
  4. ORDER BY Salida
  5. DESC LIMIT 10
contiene graves errores de sintaxis y no puede estar dandote un resultado. No importa cuánto tarde.

Postea la sentencia real para ver qué se peude hacer
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 07/06/2009, 11:44
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Ordenar consulta

He dado por supuesto que funciona

obvimente el segundo miembro de ese sumatorio no puede ser exáctemente así

fecha_de_entrada+INTERVAL duracion SECOND AS Salida

y el order by no se puede hacer por el alias....

ORDER BY Salida

....

como dice gnzsoloyo manda la sentencia real que te esta funcionado, si es que lo hace, y explicanos que es esto INTERVAL duracion SECOND.

Quim
  #5 (permalink)  
Antiguo 07/06/2009, 16:30
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: Ordenar consulta

La consulta real es:

SELECT src, start+INTERVAL length SECOND AS Salida
FROM cdr
WHERE length>0
ORDER BY Salida DESC
LIMIT 10

Lo había puesto de memoria, pero veo que no me había ido mucho, simplemente me inventé el nombre de los campos, os aseguro que funciona.

El WHERE length>0 es simplemente para evitar los que están en linea o el tiempo a sido 0.

start+INTERVAL length SECOND, lo que hace es sumar a la fecha de inicio los segundos del campo length, es decir si start='2009-06-07 22:00:00' y length=20 (segundos), el resultado Salida='2009-06-07 22:00:20'

Por otra parte, que yo sepa se puede ordenar por el alias del campo.

Yo había pensado usar una tabla temporal, es decir hacer una primera consulta ordenando por el Id DESC que es rápido, si necesito 10 pues hacer un LIMIT 100 y sobre esos 100 (que entiendo deberían estar en una tabla temporal) hacer la ordenación por Salida DESC.

No sé si será la mejor opción, por eso pregunto, aparte no he trabajado con tablas temporales y la información que he visto en Español no me ha aclarado mucho.

Gracias.

Última edición por alexisns; 07/06/2009 a las 17:10
  #6 (permalink)  
Antiguo 07/06/2009, 17:10
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: Ordenar consulta

Viendo las respuestas a otro hilo sobre un sumatorio se me ha ocurrido aplicarlo y ha funcionado perfectamente y muy rápido que es lo que interesaba.

Posteo la solución, por si le sirve a alguien:

SELECT t.src, t.Salida
FROM(SELECT id_cdr,src, start+INTERVAL length SECOND AS Salida FROM cdr WHERE length>0 ORDER BY id_cdr DESC LIMIT 100) t
ORDER BY t.Salida
LIMIT 10

Gracias.
  #7 (permalink)  
Antiguo 07/06/2009, 18:14
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar consulta

A pesar de tu afirmación, tengo problemas para entender cómo es posible que esto:
Código sql:
Ver original
  1. SELECT src, START+INTERVAL LENGTH SECOND AS Salida
  2. FROM cdr
  3. WHERE length>0
  4. ORDER BY Salida DESC
  5. LIMIT 10
funcione por las siguientes causas:
1. INTERVAL solo es una función de comparación (INTERVAL(param1, param2, param3, ...)) cuya función devuelve el parámetro mayor del conjunto o sino -1.
2. INTERVAL como cláusula de una función de fecha tal como la describes debería ser:
Código sql:
Ver original
  1. DATE_ADD(START, INTERVAL xxx SECOND)
3. No se podría usar LENGTH como nombre de campo o de variable porque es una palabra reservada por ser la función de caracteres LENGTH(x, y), que devuelve los y caracteres desde la izquierda de x.
4. No se puede usar START por ser sentencia de inicio de transacciones (START TRANSACTION), y por lo tanto también es palabra reservada.

Adicionalmente, el primer ejemplo contenía como error que estabas usando un alias como campo del WHERE, que MySQL no admite.

Por estas razones, que puedo sostener manual en mano, es que como decía, es imposible que esa sentencia opere como dices porque no cumple con la sintaxis:
1. No contiene la función DATE_ADD() que supondría que estás invocando.
2. Contiene palabras reservadas como nombres de campo sin la resolución adecuada por medio de acentos (`).

Si puedes explicarme cómo es posible que funcione te lo agradecería.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 07/06/2009 a las 18:33
  #8 (permalink)  
Antiguo 08/06/2009, 04:18
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: Ordenar consulta

gnzsoloyo, no se las causas, pero funciona te paso una captura de pantalla del phpmyadmin, donde utilizo lo de interval y las palabras reservadas que indicas.

Añadir que la BD no la creé yo, es posible que el que la creó pudiera autorizar esas palabras, no sé si puedo estar diciendo una barbaridad, pues yo soy simplemente un usuario un poco avanzado que de vez en cuando hago unas consultas para mostrarlas con un php.

En cuanto a las palabras reservadas, observo que start en el phpmyadmin lo pone en mayúsculas y en rojo, como si fuera un comando, pero en cambio en la consulta coge el valor correcto del campo.

La verdad no se explicarte más, se escapa a mis conociemientos, espero sepas disculparme.

Un saludo.

PD: no te puedo subir el adjunto, me he vuelto loco y no sé como, solo aprenda a hacerlo cuelgo la imagen.
  #9 (permalink)  
Antiguo 08/06/2009, 05:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Ordenar consulta

Pon la dirección no como link sino como texto...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 08/06/2009, 07:36
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Ordenar consulta

Cita:
1. INTERVAL solo es una función de comparación (INTERVAL(param1, param2, param3, ...)) cuya función devuelve el parámetro mayor del conjunto o sino -1
Estoy deacuerdo... Es una función de comparación pero la forma como la opera alexins es correcta también a nivel sintactico.
date_add(start,interval nuero_segundos second)
es equivalente a
start + interval numero_segundos second

Simplemente, apoyo mas la idea de hacer uso de la función como te propone gnzsoloyo, por cuestiones de orden y elegancia.

Cita:
No se podría usar LENGTH como nombre de campo o de variable porque es una palabra reservada
De que se puede se puede.... pero no es muy recomendable. Igualmente por cuestiones de orden. No creo que clasifique como palabra reservada, pero si puede ser poco estético el dia que requieras el tamaño en caracteres del campo length.
select length(length) from tabla si bien funciona, sería una consulta muy confusa y desorganizada.

Cita:
Adicionalmente, el primer ejemplo contenía como error que estabas usando un alias como campo del WHERE, que MySQL no admite.
En el where no lo admite, pero en el order by si lo admite.
Y veo que alexins lo utiliza en el order by y no en el where. Por eso veo viable que sintáctica y funcionalmente la consulta sea correcta.

Sin embargo, como pudo confundir a una persona muy experimentada (gnzsoloyo) te recomiendo hacer uso de las funciones estandar y tomar en cuenta todas las recomendaciones que has recibido en este post.

Un saludo a ambos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming

Última edición por huesos52; 08/06/2009 a las 10:38
  #11 (permalink)  
Antiguo 08/06/2009, 10:12
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: Ordenar consulta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Pon la dirección no como link sino como texto...
lo tengo en el disco duro de mi ordenador, entonces como?
  #12 (permalink)  
Antiguo 08/06/2009, 10:16
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: Ordenar consulta

Cita:
Iniciado por huesos52 Ver Mensaje
Estoy deacuerdo... Es una función de comparación pero la forma como la opera alexins es correcta también a nivel sintactico.
date_add(start,interval nuero_segundos second)
es equivalente a
start + interval numero_segundos second

Simplemente, apoyo mas la idea de hacer uso de la función como te propone gnzsoloyo, por cuestiones de orden y elegancia.


De que se puede se puede.... pero no es muy recomendable. Igualmente por cuestiones de orden. No creo que clasifique como palabra reservada, pero si puede ser poco estético el dia que requieras el tamaño en caracteres del campo length.
select length(length) from tabla si bien funciona, sería una consulta muy confusa y desorganizada.


En el where no lo admite, pero en el order by si lo admite.
Y veo que alexins lo utiliza en el order by y no en el where. Por eso veo viable que sintáctica y funcionalmente la consulta sea correcta.

Sin embargo, como pudo confundir a una persona muy experimentada (gnzsoloyo) te recomiendo hacer uso de las funciones estandar y tomar en cuenta todas las recomendaciones que has recibido en este post.

Un saludo a ambos
Gracias por tus comentarios huesos52, tomo nota, lo malo es que no soy yo el administrador de la base de datos y contra el nombre de los campos poco o nada puedo hacer.

En el primer post, sí que utilicé un alias en el Where, por tanto evidentemente no podía funcionar.

Da gusto encontrar un foro tan activo como este, un saludo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




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