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

Saber columna de cada valor en un Select

Estas en el tema de Saber columna de cada valor en un Select en el foro de Mysql en Foros del Web. Buenas, No se como realizar una búsqueda: Tengo 2 tablas: Contador empresa tag1 tag2 tag3 tag4 A 4 6 3 2 B 2 4 4 ...
  #1 (permalink)  
Antiguo 03/03/2013, 07:15
(Desactivado)
 
Fecha de Ingreso: enero-2011
Mensajes: 10
Antigüedad: 13 años, 3 meses
Puntos: 0
Saber columna de cada valor en un Select

Buenas,

No se como realizar una búsqueda:

Tengo 2 tablas:

Contador

empresa tag1 tag2 tag3 tag4

A 4 6 3 2
B 2 4 4 0
C 5 4 3 1

Tags

empresa tag1 tag2 tag3 tag4

A as es en yu
B de tr ul mo
C we mi po li

La búsqueda sería, primero ordenar la tabla contador uniendo todas las columnas, que esto ya lo he conseguido.

Select empresa,tag1 AS tag From contador Union All Select empresa,tag2 AS tag From contador Union All Select empresa,tag3 AS tag From contador Union All Select empresa,tag4 AS tag From contador AS tag From contador ORDER BY tag DESC

Y después obtener a que nombre de la tabla Tags corresponde cada uno de los valores obtenidos en la primera búsqueda. Es decir:

Si el valor más grande de 'contador' es 6 y corresponde a tag2 y a la empresa 'A' saber que su valor es 'es'


He estado intentado añadir al Select el valor de la columna que le corresponde pero no lo consigo. Algo como:

Select empresa,tag1 AS tag,'tag1' AS columna From contador

Así después podría buscar en la segunda columna que palabra le corresponde.

Muchas gracias!!
  #2 (permalink)  
Antiguo 04/03/2013, 11:49
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Saber columna de cada valor en un Select

Hola Divit:

En lo particular, creo que tienes un mal modelo de tablas, porque desde mi punto de vista a redundancia de datos, pero bueno, en realidad esa no fue la pregunta, pero si creo que deberías darle un vistazo a la teoría sobre modelo Entidad-Relación para que veas a qué me refiero...

Volviendo al tema que nos atañe, en realidad no se me ocurrió una respuesta muy trivial, pero podrías hacerlo más o menos así:

Código:
SELECT 
  T1.empresa, 
  CASE columna 
    WHEN 'tag1' THEN tag1
    WHEN 'tag2' THEN tag2 
    WHEN 'tag3' THEN tag3
    WHEN 'tag4' THEN tag4  
  END tag
FROM tags T1
INNER JOIN 
(  SELECT empresa, tag1 tag, 'tag1' columna
   FROM contador 
   UNION ALL 
   SELECT empresa, tag2 tag, 'tag2' columna 
   FROM contador 
   UNION ALL 
   SELECT empresa, tag3 tag, 'tag3' columna 
   FROM contador 
   UNION ALL 
   SELECT empresa, tag4 tag, 'tag4' columna
   FROM contador 
   ORDER BY tag DESC LIMIT 1
 ) T2 ON T1.empresa = T2.empresa
En este punto cabe una pregunta, ¿qué pasaría cuando el tag con el número máximo no fuera único? Con los datos que pones no se da el caso, pero ¿qué pasaría si existiera otro 6 para otra empresa, o para la misma empresa pero en distintos tags? ¿qué es lo que se debería presentar como salida? porque la consulta que propongo presentaría sólo un elemento. Si necesitaras todos los elementos entonces la estrategia sería distinta. Dale un vistazo para ver si te sirve.

Saludos
Leo.
  #3 (permalink)  
Antiguo 05/03/2013, 06:59
(Desactivado)
 
Fecha de Ingreso: enero-2011
Mensajes: 10
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Saber columna de cada valor en un Select

Buenas Leo,

Antes que nada, gracias por tu respuesta.

Como dices parece una redundancia de datos, pero no se me ocurre otra forma de hacerlo.

La tabla de contador es un contador de visitas de páginas dinámicas de mi web y tags es digamos la correspondencia o palabra clave de dicha web.

La tabla tags va en verdad del 1 al 20 e introduzco palabras y cada palabra corresponde a una web.

La tabla contador tiene las mismas filas y columnas y va insertando el número de visitas que va teniendo cada página.

Después quiero hacer un ranquing de las páginas más vistas, por lo que una vez ordenado de mayor a menor todas las filas de la tabla tags solo me queda saber a que empresa y tag corresponde cada posición de dicha fila.

Estoy intentando incorporar tu código pero no entiendo a que corresponde T1 y T2 y la palabra tag donde pone END tag

Muchas gracias!
  #4 (permalink)  
Antiguo 05/03/2013, 14:33
(Desactivado)
 
Fecha de Ingreso: enero-2011
Mensajes: 10
Antigüedad: 13 años, 3 meses
Puntos: 0
Respuesta: Saber columna de cada valor en un Select

Ya lo he resuelto, muchas gracias Leo!
  #5 (permalink)  
Antiguo 05/03/2013, 15:19
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Saber columna de cada valor en un Select

Hola Divit:

Me da gusto que te haya servido la consulta. Con respecto a tu modelo de datos, creo que en realidad podrías simplificarlo mucho. Por ejemplo, podrías tener una sola tabla donde almacenes la empresa y el tag al que se accedió (supongo que como tienes en realidad haces un update para incrementar en 1 el contador respectivo), creo que podría quedar así:

Código:
mysql> SELECT * FROM tabla;
+---------+------+
| empresa | tag  |
+---------+------+
| A       | as   |
| A       | es   |
| A       | en   |
| A       | yu   |
| B       | de   |
| B       | de   |
| A       | as   |
| A       | as   |
| B       | tr   |
| C       | we   |
| C       | po   |
| C       | po   |
| C       | po   |
+---------+------+
13 rows in set (0.00 sec)
Para obtener el ranking de las páginas visitadas simplemente tendrías que hacer esto:

Código:
mysql> SELECT empresa, tag ,COUNT(*) total
    -> FROM tabla
    -> GROUP BY empresa, tag ORDER BY total DESC;
+---------+------+-------+
| empresa | tag  | total |
+---------+------+-------+
| C       | po   |     3 |
| A       | as   |     3 |
| B       | de   |     2 |
| A       | en   |     1 |
| A       | yu   |     1 |
| B       | tr   |     1 |
| C       | we   |     1 |
| A       | es   |     1 |
+---------+------+-------+
8 rows in set (0.00 sec)
Dale un vistazo para ver si te sirve

Saludos
Leo.

Etiquetas: columna, php, 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 08:12.