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

Agregar indice a campo repetido

Estas en el tema de Agregar indice a campo repetido en el foro de Mysql en Foros del Web. Tengo una consulta aparentemente sencilla... pero que no me puedo encontrar en google porque siempre se confunde con group lo que quiero. Tengo una BD ...
  #1 (permalink)  
Antiguo 25/02/2011, 08:43
Avatar de tpzurdo  
Fecha de Ingreso: julio-2007
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Agregar indice a campo repetido

Tengo una consulta aparentemente sencilla... pero que no me puedo encontrar en google porque siempre se confunde con group lo que quiero.

Tengo una BD que es así:

1 ---------- Carlos
2 ---------- Juan
3 ---------- Carlos

Quiero que en la búsqueda salga.

1 ---------- Carlos(1)
2 ---------- Juan
3 ---------- Carlos (2)

Parece un select sencillo pero no me sale.

SELECT id_nombre, concat( nombre, '(', ?????? , ')' ) FROM nombre

Creo que solo me falta lo que esta como ?????? ojalá sea asi de sencillo algo asi como fieldindex no existe?
  #2 (permalink)  
Antiguo 25/02/2011, 08:46
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Agregar indice a campo repetido

Código MySQL:
Ver original
  1. SELECT id_nombre, concat( nombre, '(',COUNT(*) , ')' )
  2. FROM nombre
  3. GROUP BY id_nombre
O bien:
Código MySQL:
Ver original
  1. SELECT id_nombre, CONCAT(nombre, '(', cantidad, ')') nombres
  2.     (SELECT id_nombre, concat( nombre, COUNT(*) cantidad
  3.     FROM nombre
  4.     GROUP BY nombre)  T1
__________________
¿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 25/02/2011, 09:13
Avatar de tpzurdo  
Fecha de Ingreso: julio-2007
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Agregar indice a campo repetido

La primera no funciona, también la había probado pero los indices entre paréntesis me dan (1) no se porque... me parecía la más lógica del mundo...

La segunda es mi camino preferido el que estaba tratando de sacar... pero me tira un error de mysql que estoy tratando de deducir con mi reducida capacidad.

Gracias de todas maneras voy a tratar con esto de formar algo que sirva... es cuestión de pensar y toquetear en el phpMyAdmin...
  #4 (permalink)  
Antiguo 25/02/2011, 09:20
Avatar de tpzurdo  
Fecha de Ingreso: julio-2007
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Agregar indice a campo repetido

Ahora si.. un paréntesis o algo asi muchas gracias!!!

Código MySQL:
Ver original
  1. SELECT id_nombre,cantidad
  2. SELECT id_nombre, CONCAT( nombre,'(', COUNT( * ),')' ) AS cantidad
  3. FROM nombre
  4. GROUP BY nombre
  5. )T1

Que bueno aprendí muchísimo escribiendo esto... no sabía que se enlistaban asi las consultas... me cuesta encontrar cosas medianamente complejas de mysql en internet
  #5 (permalink)  
Antiguo 25/02/2011, 09:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Agregar indice a campo repetido

Si, lo siento. Me quedó basura en las consulta:
Código MySQL:
Ver original
  1. SELECT id_nombre, CONCAT( nombre,'(', COUNT( * ),')' ) cantidad
  2. FROM nombre
  3. GROUP BY nombre;
  4.  
  5. SELECT id_nombre, CONCAT(nombre, '(', cantidad, ')') nombres
  6.     (SELECT id_nombre, nombre, COUNT(*) cantidad
  7.     FROM nombre
  8.     GROUP BY nombre)  T1;
Detalle importante: No uses el mismo nombre para la tabla que para un campo de la tabla misma. Eso puede generar problemas de interpretación jerárquica en el parser de MySQL y dar resultados erráticos.
__________________
¿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 25/02/2011, 09:41
Avatar de tpzurdo  
Fecha de Ingreso: julio-2007
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Agregar indice a campo repetido

Uh no realmente lo que quería es un índice... o sea... el planteo inicial

1 ---------- Carlos(1)
2 ---------- Juan
3 ---------- Carlos (2)

ahora dice

1 ---------- Carlos(2)
2 ---------- Juan
3 ---------- Carlos (2)

uf que mal
  #7 (permalink)  
Antiguo 25/02/2011, 10:00
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Agregar indice a campo repetido

Esto debería funcionarte bien:
Código MySQL:
Ver original
  1. SELECT CONCAT( nombre,'(', COUNT( * ),')' ) cantidad
  2. FROM nombre
  3. GROUP BY nombre;
El tema pasa porque si estás agrupando por nombres no tiene ningún sentido que aparezca el id_nombre, porque pertenecen al campo agrupado.
Es posible que en tu caso ese comportamiento se deba a usar la misma denominación para tabla que para columna.
Cambia el nombre de una de las dos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 25/02/2011, 11:01
Avatar de tpzurdo  
Fecha de Ingreso: julio-2007
Mensajes: 83
Antigüedad: 17 años, 4 meses
Puntos: 0
Respuesta: Agregar indice a campo repetido

Lo quiero así, entre paréntesis va el índice no la cantidad de veces que se repite el campo en la tabla.

1 ---------- Carlos(1)
2 ---------- Juan
3 ---------- Carlos (2)

no así

1 ---------- Carlos(2)
2 ---------- Juan

Necesito una especie de contador de repeticiones del registro entre los paréntesis... me parecía sencillo pero no lo logro la verdad. Sucede que muchos clientes duplican el nombre de una etiqueta y quiero que se note cual de todos los ingresos.

Quizás con una unión lo pueda lograr pero ahora ya me estoy quemando las neuronas y cuando pasa eso nunca me sale.
  #9 (permalink)  
Antiguo 25/02/2011, 12:16
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Agregar indice a campo repetido

Ahora se entiende mejor: Lo que quieres es contar y numerar las apariciones de los diferentes registros con el mismo nombre...
Buen, eso se puede hacer, pero no es una consulta simple. Se necesitan dos variables de usuario y una subconsulta.
Mas o menos así:
Código MySQL:
Ver original
  1.     id_nombre, CONCAT(nombre, ' (', id,')') nombres
  2.   (SELECT
  3.      IF(@nombre='', @nombre:=nombre, nombre) A,
  4.       id_nombre,
  5.       nombre,
  6.       IF(nombre!= @nombre,@idx:=1, @idx:=@idx+1) id,
  7.       @nombre:=nombre
  8.   FROM nombre JOIN (SELECT @nombre:='', @idx:=1) T2
  9.   ORDER BY nombre) T0
  10. ORDER BY id_nombre;

Algo así:
Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->     id_nombre, CONCAT(nombre, ' (', id,')') nombres
  3.     -> FROM
  4.     ->   (SELECT
  5.     ->      IF(@nombre='', @nombre:=nombre, nombre) A,
  6.     ->       id_nombre,
  7.     ->       nombre,
  8.     ->       IF(nombre!= @nombre,@idx:=1, @idx:=@idx+1) id,
  9.     ->       @nombre:=nombre
  10.     ->   FROM nombres JOIN (SELECT @nombre:='', @idx:=0) T2
  11.     ->   ORDER BY nombre) T0
  12.     -> ORDER BY id_nombre;
  13. +-----------+------------+
  14. | id_nombre | nombres    |
  15. +-----------+------------+
  16. |         1 | Carlos (1) |
  17. |         2 | Juan (1)   |
  18. |         3 | Carlos (2) |
  19. |         4 | Carlos (3) |
  20. |         5 | Jose (1)   |
  21. +-----------+------------+
  22. 5 rows in set (0.00 sec)
__________________
¿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; 25/02/2011 a las 12:22
  #10 (permalink)  
Antiguo 25/02/2011, 13:56
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Agregar indice a campo repetido

Hola compañer@s...

Hace algún tiempo encontré una forma de hacer esto mismo utilizando las funciones GROUP_CONCAT y FIND_IN_SET... igual y y la pueden probar para ver si les puede ayudar.

Código MySQL:
Ver original
  1. mysql> create table nombre (id_nombre int, nombre varchar(20));
  2. Query OK, 0 rows affected (0.05 sec)
  3.  
  4. mysql> insert into nombre values (1, 'Carlos'), (2, 'Juan'), (3, 'Carlos'), (4,
  5. 'Carlos'), (5, 'José');
  6. Query OK, 5 rows affected (0.02 sec)
  7. Records: 5  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> #mostramos los resultados originales
  10. mysql> select * from nombre;
  11. +-----------+--------+
  12. | id_nombre | nombre |
  13. +-----------+--------+
  14. |         1 | Carlos |
  15. |         2 | Juan   |
  16. |         3 | Carlos |
  17. |         4 | Carlos |
  18. |         5 | José   |
  19. +-----------+--------+
  20. 5 rows in set (0.00 sec)
  21.  
  22. mysql> #obtenemos los registros numerados
  23. mysql> SELECT T2.id_nombre, CONCAT(T2.nombre, ' (',
  24.     -> FIND_IN_SET(T2.id_nombre ,
  25.     -> (
  26.     -> SELECT GROUP_CONCAT(id_nombre ORDER BY id_nombre, nombre DESC)
  27.     -> FROM nombre T1 WHERE T1.nombre = T2.nombre )
  28.     -> ), ')') as nombres FROM nombre T2;
  29. +-----------+------------+
  30. | id_nombre | nombres    |
  31. +-----------+------------+
  32. |         1 | Carlos (1) |
  33. |         2 | Juan (1)   |
  34. |         3 | Carlos (2) |
  35. |         4 | Carlos (3) |
  36. |         5 | José (1)   |
  37. +-----------+------------+
  38. 5 rows in set (0.00 sec)

Saludos y espero que les pueda servir de algo.
Leo

Etiquetas: duplicado, duplicated, index, indice, match, repetido
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 16:13.