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

[SOLUCIONADO] Seleccionar el primer número NO consecutivo en una lista

Estas en el tema de Seleccionar el primer número NO consecutivo en una lista en el foro de Mysql en Foros del Web. Tengo una tabla en mySQL que contiene el Ranking de varias categorías de autos de carrera. Diariamente se añaden registros en la tabla Ranking con ...
  #1 (permalink)  
Antiguo 02/05/2013, 12:57
Avatar de francoBalsamo  
Fecha de Ingreso: mayo-2013
Ubicación: San Jorge
Mensajes: 6
Antigüedad: 11 años
Puntos: 2
Seleccionar el primer número NO consecutivo en una lista

Tengo una tabla en mySQL que contiene el Ranking de varias categorías de autos de carrera.
Diariamente se añaden registros en la tabla Ranking con números al azar. Por ejemplo un piloto pide el número y, si esta disponible, se le asigna ese número.

la Tabla Ranking tiene la siguiente estructura:

idRanking (int) PK;

driver_id (int) FK;

category_id (int) FK;

carName (varchar);
Mi problema esta en que el Ranking de una categoría no esta compuesto por números consecutivos, por ejemplo una lista de ranking para la categoría X puede ser esta:

1 - JUAN;
2 - PEDRO;
3 - MARCELO;
5 - HECTOR;
6 - OTRO_1;
7 - OTRO_2;
8 - OTRO_3;
10 - OTRO_4;

Si FRANCO pide número puedo darle el 11 que en SQL sería:
Código MySQL:
Ver original
  1. SELECT MAX(R.`numero`)+1 AS NewNumero
  2. FROM `ranking` AS R WHERE R.`categoria`=X

Como genero una consulta para darle a FRANCO en número 4. Ya que el número 4 es el primer número que no está en la lista

Última edición por gnzsoloyo; 02/05/2013 a las 13:08 Razón: Mal etiquetado
  #2 (permalink)  
Antiguo 02/05/2013, 13:09
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: Seleccionar el primer número NO consecutivo en una lista

Tu pregunta muestra un erróneo concepto acerca de las PK. Estás confundiendo un ranking, que es un valor de posición en un momento determinado del tiempo, con el ID de un participante del ranking.
Tengo la impresión de que tu base está mal diseñada. En cualquier caso, si lo que quieres es que el orden salga numerado desde base, no necesitas hacer alteraciones a la misma, sino crear el ranking en la consulta misma.

Renumerar un campo auto_increment

Cómo numerar secuencialmente una consulta, sin usar PK
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/05/2013, 17:38
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Seleccionar el primer número NO consecutivo en una lista

Creo que gnzsoloyo acierta al decir:
Cita:
Tu pregunta muestra un erróneo concepto acerca de las PK. Estás confundiendo un ranking, que es un valor de posición en un momento determinado del tiempo, con el ID de un participante del ranking.
Tengo la impresión de que tu base está mal diseñada.
Si te he entendido bien, deberías añadir un campo para ese número (número de dorsal), un campo que harás índice único para no repetirlo. Naturalmente, podrás ordenar el ranking con sus números de dorsal o lo que sea. Será fácil encontrar, mediante búsquedas si un número está o no está. Pero buscar el número más bajo ausente o todos los números ausentes requiere usar de programación o crear una tabla numérica, con los números del 1 en adelante hasta donde consideres oportuno (podría hacerse en una tabla virtual generada al efecto o crear una importando desde una hoja de cálculo que facilita mediante el autocompletado una secuencia de números) para comparar mediante LEFT JOIN con el número de dorsal de la otra. Verás así todos los números ausentes y naturalmente podrás asignar el más bajo o el más alto.
  #4 (permalink)  
Antiguo 03/05/2013, 06:16
Avatar de francoBalsamo  
Fecha de Ingreso: mayo-2013
Ubicación: San Jorge
Mensajes: 6
Antigüedad: 11 años
Puntos: 2
Respuesta: Seleccionar el primer número NO consecutivo en una lista

perdón pero me confundí al poner los campos de la tabla Ranking:

Estructura correcta de la tabla `ranking`

Código MySQL:
Ver original
  1. idRanking (int) PK;
  2.  
  3. driver_id (int) FK;
  4.  
  5. category_id (int) FK;
  6.  
  7. carNumber (int); /* me falto este campo: JUSTAMENTE EL CAMPO DE LA DISCORDIA*/
  8.  
  9. carName (varchar);
Mil disculpas; esto lo escribí a contra reloj y en el apuro me confundí. Les agradezco su respuesta. Espero que con esta corrección me puedan ayudar

Última edición por gnzsoloyo; 03/05/2013 a las 06:32
  #5 (permalink)  
Antiguo 03/05/2013, 06:32
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: Seleccionar el primer número NO consecutivo en una lista

La pregunta principal para poder responderte: ¿Esa tabla tiene que consignar el ranking actual, o necesitarás que sea trazable históricamente? (se entiende por tal que puedas obtener el ranking que existió antes, en cualquier período de tiempo seleccionado).
Si quieres que sea trazable, ese valor es innecesario. Si no quieres que sea trazable... La verdad tampoco lo veo necesario, pero se puede hacer, pero no en un paso.

¿Qué dices?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 03/05/2013, 06:54
Avatar de francoBalsamo  
Fecha de Ingreso: mayo-2013
Ubicación: San Jorge
Mensajes: 6
Antigüedad: 11 años
Puntos: 2
Respuesta: Seleccionar el primer número NO consecutivo en una lista

gnzsoloyo y jurena les pido mil disculpas; soy un atolondrado que tipea por inercia sin leer lo que escribe.

Creo que la respuesta de jurena me puede ayudar: Creando una tabla con números desde el 14 hasta el 999 y comparando mediante LEFT JOIN con la tabla `ranking` es una solución viable.
  #7 (permalink)  
Antiguo 03/05/2013, 06:56
Avatar de francoBalsamo  
Fecha de Ingreso: mayo-2013
Ubicación: San Jorge
Mensajes: 6
Antigüedad: 11 años
Puntos: 2
Respuesta: Seleccionar el primer número NO consecutivo en una lista

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La pregunta principal para poder responderte: ¿Esa tabla tiene que consignar el ranking actual, o necesitarás que sea trazable históricamente? (se entiende por tal que puedas obtener el ranking que existió antes, en cualquier período de tiempo seleccionado).
Si quieres que sea trazable, ese valor es innecesario. Si no quieres que sea trazable... La verdad tampoco lo veo necesario, pero se puede hacer, pero no en un paso.

¿Qué dices?
gnzsoloyo tiene que tener en cuenta solo en Ranking actual.-
  #8 (permalink)  
Antiguo 03/05/2013, 07:50
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: Seleccionar el primer número NO consecutivo en una lista

¿Y ya has pensado que en realidad, para obtener un ranking actual, no es necesario almacenarlo en ninguna parte, no?
Un truco que podemos intentar para detectar huecos en los números sería por ejemplo:
Código MySQL:
Ver original
  1. SELECT T1.Numero
  2.     (SELECT (R.`numero`+1) Numero
  3.     FROM `ranking` R
  4.     WHERE `categoria`=X)
  5.  T1
  6.     LEFT JOIN
  7.     (SELECT (R.`numero`) Numero
  8.     FROM `ranking` R
  9.     WHERE `categoria`=X) T2 ON T1.Numero = T2.Numero
  10. WHERE T2.Numero IS NULL;
Esto no te los devolverá todos (para eso se requiere otra forma de consulta, pero es un inicio, cuando tienes un único hueco.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: mysql+consulta, sql
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 15:51.