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

Corrección de código para consulta MySql

Estas en el tema de Corrección de código para consulta MySql en el foro de Mysql en Foros del Web. Hola, Estoy creando una consulta desde una sola columna de una tabla para que el resultado se muestre como una tabla nueva, es decir; cada ...
  #1 (permalink)  
Antiguo 09/10/2018, 11:07
 
Fecha de Ingreso: noviembre-2015
Mensajes: 49
Antigüedad: 2 años, 11 meses
Puntos: 2
Corrección de código para consulta MySql

Hola,

Estoy creando una consulta desde una sola columna de una tabla para que el resultado se muestre como una tabla nueva, es decir; cada uno de los elementos de la columna debe verse como un domicilio horizontalmente ya que en la columna se guarda de forma vertical. Ahora bien, logré crear la nueva tabla con la consulta que hice, pero no hace lo que necesito; lo que hace es que me muestra los resultados de la siguiente forma:
nuevo | tipo_via | calle | numero_exterior | numero_interior | referencia | codigo_postal | estado | municipio | ciudad | area_metropolitana | brick_atv | brick_ims | zona_postal | colonia| lada
11010026 0 0 0 0 0 0 0 0 0 0 0 11010026 0 0 0
11010034 0 0 0 0 0 0 0 0 0 0 0 11010034 0 0 0
11010046 0 0 0 0 0 0 0 0 0 0 0 11010046 0 0 0
11025001 0 0 0 0 0 0 0 0 0 0 0 11025001 0 0 0
4.45512E+11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
111001 0 0 0 0 0 0 0 0 0 0 111001 0 0 0 0
111002 0 0 0 0 0 0 0 0 0 0 111002 0 0 0 0
112500 0 0 0 0 0 0 0 0 0 0 112500 0 0 0 0
1303 0 1303 0 0 0 0 0 0 0 0 0 0 0 0 0
210 0 210 0 0 0 0 0 0 0 0 0 0 0 0 0
301 0 0 301 0 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0
45 0 0 45 0 0 0 0 0 0 0 0 0 0 0 0
465 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
53100 0 0 0 0 0 53100 0 0 0 0 0 0 0 0 0
54050 0 0 0 0 0 54050 0 0 0 0 0 0 0 0 0
54060 0 0 0 0 0 54060 0 0 0 0 0 0 0 0 0
54080 0 0 0 0 0 54080 0 0 0 0 0 0 0 0 0
7 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0
75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
AVENIDA AVENIDA 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CALLE CALLE 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CALZADA CALZADA 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CARPINTERIA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CERRADA CERRADA 0 0 0 0 0 0 0 0 0 0 0 0 0 0
CIUDAD SATELITE 0 0 0 0 0 0 0 0 0 0 0 0 0 CIUDAD SATELITE 0
CONJUNTO PINTORES 0 0 0 0 0 0 0 0 0 0 0 0 0 CONJUNTO PINTORES 0
DATOS CONFIRMADOS 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DIEZ 0 DIEZ 0 0 0 0 0 0 0 0 0 0 0 0 0
DOCTOR 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
DOLOR ABDOMINAL 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ENFERMERA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Galderma 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
GASTRITIS 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
INACTIVO 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
JACARANDAS AMPLIACION 0 0 0 0 0 0 0 0 0 0 0 0 0 JACARANDAS AMPLIACION 0
JUBILADO DE DIRECCION 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LA LOMA 0 0 0 0 0 0 0 0 0 0 0 0 0 LA LOMA 0
Mead Johnson 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
MEXICO 0 0 0 0 0 0 MEXICO 0 0 0 0 0 0 0 0
NAUCALPAN DE JUAREZ 0 0 0 0 0 0 0 NAUCALPAN DE JUAREZ 0 0 0 0 0 0 0
PRUEBA 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[email protected] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[email protected] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SI 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
TLALNEPANTLA DE BAZ 0 0 0 0 0 0 0 TLALNEPANTLA DE BAZ 0 0 0 0 0 0 0
YA NO LABORA AHI 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0


Si observan, no crea una sola fila sino qué crea varias filas que no se ven como un solo registro, en mi caso un registro puede tener 3 domicilios por lo que se supone que debería verse 3 veces o más bien, debería generar 3 filas, se supone que debe verse así:

tipo_via calle numero_exterior numero_interior referencia codigo_postal estado municipio ciudad area_metropolitana brick_atv brick_ims zona_postal colonia lada
AVENIDA 1303 301 0 0 53100 MEXICO NAUCALPAN DE JUAREZ 0 0 11025001 11010026 0 CIUDAD SATELITE 0
CALLE 210 45 0 0 54050 MEXICO TLALNEPANTLA DE BAZ 0 0 111001 11010034 0 CONJUNTO PINTORES 0
CALZADA DIEZ 0 7 0 54060 MEXICO TLALNEPANTLA DE BAZ 0 0 111002 11010046 0 JACARANDAS AMPLIACION 0
CERRADA 0 0 4 0 54080 MEXICO TLALNEPANTLA DE BAZ 0 0 112500 0 0 LA LOMA

Este es mi código:
Código PHP:
SELECT p.nuevo
(CASE 
WHEN r.campo 'tipo_via' THEN s.nuevo ELSE 0 END) AS tipo_via
(CASE 
WHEN r.campo 'calle' THEN s.nuevo ELSE 0 END) AS calle
(CASE 
WHEN r.campo 'numero_exterior' THEN s.nuevo ELSE 0 END) AS numero_exterior
(CASE 
WHEN r.campo 'numero_interior' THEN s.nuevo ELSE 0 END) AS numero_interior,
(CASE 
WHEN r.campo 'referencia' THEN s.nuevo ELSE 0 END) AS referencia
(CASE 
WHEN r.campo 'codigo_postal' THEN s.nuevo ELSE 0 END) AS codigo_postal,
(CASE 
WHEN r.campo 'estado' THEN s.nuevo ELSE 0 END) AS estado,
(CASE 
WHEN r.campo 'municipio' THEN s.nuevo ELSE 0 END) AS municipio,
(CASE 
WHEN r.campo 'ciudad' THEN s.nuevo ELSE 0 END) AS ciudad,
(CASE 
WHEN r.campo 'area_metropolitana' THEN s.nuevo ELSE 0 END) AS area_metropolitana,
(CASE 
WHEN r.campo 'brick_atv' THEN s.nuevo ELSE 0 END) AS brick_atv,
(CASE 
WHEN r.campo 'brick_ims' THEN s.nuevo ELSE 0 END) AS brick_ims,
(CASE 
WHEN r.campo 'zona_postal' THEN s.nuevo ELSE 0 END) AS zona_postal,
(CASE 
WHEN r.campo 'colonia' THEN s.nuevo ELSE 0 END) AS colonia,
(CASE 
WHEN r.campo 'lada' THEN s.nuevo ELSE 0 END) AS lada
FROM cambio p 
INNER JOIN cambio s ON p
.id_cambio s.id_cambio 
INNER JOIN cambio r ON s
.nuevo r.nuevo 
GROUP BY p
.nuevo 
He buscado en internet y de hecho es como conseguí esta forma de consulta que es lo más apegado a lo que requiero. Cabe mencionar que estoy trabajando con tablas relacionales pero para esta consulta solo trabajo con la tabla "cambio" específicamente con el los campos 'nuevo' y 'campo'
Este es el header de mi tabla cambio:
id_cambio|id_campania|id_usuario|id_entidad|.....e ntidad......|...anterior..|......nuevo...........| .......campo.......|fecha_cambio
.....9.... |.....1....|.....5....|.....1....|.....Datos Medico.|.............|[email protected]|..... ..email_1.....|08/10/2018
....10... |.....1....|.....5....|.....1....|.....Datos Medico.|.............|[email protected]|..... ..email_2.....|08/10/2018
....11... |.....1....|.....5....|.....1....|.....Datos Medico.|.CARPINTERIA.|......................|..... ...hobbie.....|08/10/2018
....12... |.....1....|.....5....|.....1....|.....Datos Medico.|......NO.....|..........SI..........|.publ ica_revistas..|08/10/2018
....13... |.....1....|.....5....|.....1....|.....Datos Medico.|...ACTIVO....|..DATOS CONFIRMADOS...|......estatus......|08/10/2018
....14... |.....1....|.....5....|.....1....|.....Domicilio.. .....|...AVENIDA...|.........CALLE........|......t ipo_via.....|08/10/2018
....15... |.....1....|.....5....|.....2....|.....Domicilio.. .....|....CALLE....|........CALZADA.......|......t ipo_via.....|08/10/2018

Espero me puedan auxiliar a corregir mi consulta.
Gracias por su apoyo.

P.D. Disculpen las tablas tan terribles, pero con este editor no las puedo dejar muy fijas que digamos.
__________________
paco alonso

Última edición por madison_sg; 09/10/2018 a las 11:30
  #2 (permalink)  
Antiguo 09/10/2018, 12:32
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.308
Antigüedad: 12 años, 2 meses
Puntos: 760
Respuesta: Corrección de código para consulta MySql

ya probaste con la funcion pivot? ya pusiste el ejemplo de tu tabla, ahora como quieres que se muestren losdatos?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 09/10/2018, 12:40
 
Fecha de Ingreso: noviembre-2015
Mensajes: 49
Antigüedad: 2 años, 11 meses
Puntos: 2
Respuesta: Corrección de código para consulta MySql

Cita:
Iniciado por Libras Ver Mensaje
ya probaste con la funcion pivot? ya pusiste el ejemplo de tu tabla, ahora como quieres que se muestren losdatos?
Hola, esa es la cosa; que no sé si esto es una función pivot porque de donde la obtuve decía que era un ejemplo de pivot, no sé mucho de bases de datos y seguramente por eso me estoy complicando la existencia.
No se si voy por buen camino o definitivamente voy equivocado. La cosa es que esto hace lo más cercano a lo que necesito que haga pero de cualquier forma el resultado no es lo que espero. Se supone que se debería quedar en una sola fila el resultado y lo que obtengo es que pone el resultado de cada campo en escalera hacia la derecha.
Por ello, solicito ayuda para saber si esto es correcto.

Espero me puedas ayudar.
Saludos.
__________________
paco alonso

Última edición por madison_sg; 10/10/2018 a las 10:46
  #4 (permalink)  
Antiguo 10/10/2018, 10:50
 
Fecha de Ingreso: noviembre-2015
Mensajes: 49
Antigüedad: 2 años, 11 meses
Puntos: 2
Respuesta: Corrección de código para consulta MySql

De cualquier manera, revisando en foros del web, según lo que comenta gnzsoloyo quien es moderador criollo de foros del web, comenta que la función pivot no está disponible para MySql lo cual cito:

"...PIVOT existe en SQL Server, Oracle 11g, pero no en MySQL ni en POsgreSQL. En MySQL hay que emularlo, y en PosgreSQL existe una función nativa que permite obtener el resultado que deseas (Google dixit in 2 secs...)..."
Te dejo una imagen de su comentario con la liga: http://www.forosdelweb.com/f86/tabla...mysql-1151448/


Saludos.
__________________
paco alonso
  #5 (permalink)  
Antiguo 10/10/2018, 12:16
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.308
Antigüedad: 12 años, 2 meses
Puntos: 760
Respuesta: Corrección de código para consulta MySql

Si pivot no existe en mysql pero hay funciones para emularlo como bien se comenta, tu problema es que con case las columnas que no tienen valores aparecen como 0 y tu necesitas que no salgan esos 0 verdad? para eso vas a tener que hacer funciones de agregado algo como esto:


Código MySQL:
Ver original
  1. select p.nuevo, max(tipo_via) as campo1, max(calle) as calle, max(numero_exterior) as num from(
  2. SELECT p.nuevo,
  3. (CASE WHEN r.campo = 'tipo_via' THEN s.nuevo ELSE 0 END) AS tipo_via,
  4. (CASE WHEN r.campo = 'calle' THEN s.nuevo ELSE 0 END) AS calle,
  5. (CASE WHEN r.campo = 'numero_exterior' THEN s.nuevo ELSE 0 END) AS numero_exterior,
  6. (CASE WHEN r.campo = 'numero_interior' THEN s.nuevo ELSE 0 END) AS numero_interior,
  7. (CASE WHEN r.campo = 'referencia' THEN s.nuevo ELSE 0 END) AS referencia,
  8. (CASE WHEN r.campo = 'codigo_postal' THEN s.nuevo ELSE 0 END) AS codigo_postal,
  9. (CASE WHEN r.campo = 'estado' THEN s.nuevo ELSE 0 END) AS estado,
  10. (CASE WHEN r.campo = 'municipio' THEN s.nuevo ELSE 0 END) AS municipio,
  11. (CASE WHEN r.campo = 'ciudad' THEN s.nuevo ELSE 0 END) AS ciudad,
  12. (CASE WHEN r.campo = 'area_metropolitana' THEN s.nuevo ELSE 0 END) AS area_metropolitana,
  13. (CASE WHEN r.campo = 'brick_atv' THEN s.nuevo ELSE 0 END) AS brick_atv,
  14. (CASE WHEN r.campo = 'brick_ims' THEN s.nuevo ELSE 0 END) AS brick_ims,
  15. (CASE WHEN r.campo = 'zona_postal' THEN s.nuevo ELSE 0 END) AS zona_postal,
  16. (CASE WHEN r.campo = 'colonia' THEN s.nuevo ELSE 0 END) AS colonia,
  17. (CASE WHEN r.campo = 'lada' THEN s.nuevo ELSE 0 END) AS lada
  18. FROM cambio p
  19. INNER JOIN cambio s ON p.id_cambio = s.id_cambio
  20. INNER JOIN cambio r ON s.nuevo = r.nuevo
  21. GROUP BY p.nuevo
  22. ) as completa
  23. group by nuevo
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me



La zona horaria es GMT -6. Ahora son las 00:40.