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

[SOLUCIONADO] Select

Estas en el tema de Select en el foro de Mysql en Foros del Web. Hola queria saber si solo con Mysql podria hacer lo siguiente: Hago una consulta a la base de datos para 12345 y me retorna estos ...
  #1 (permalink)  
Antiguo 22/01/2013, 16:29
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Select

Hola queria saber si solo con Mysql podria hacer lo siguiente:

Hago una consulta a la base de datos para 12345 y me retorna estos valores:

Código:
Nombre	CC	nivel1	nivel2	nivel3
Prueba3	56780	45679	12345	658488
Prueba2	45679	12345	658488
Prueba	12345	658488
Hay alguna forma de que en los datos de Prueba2 y Prueba3 en las columnas de nivel1, nivel2 y nivel3 solo se muestre el valor que estoy buscando, en este caso 12345, y que las otras columnas no aparezca nada?

Lo que espero retornar bajo la consulta seria algo como esto:

Código:
Nombre	CC	nivel1	nivel2	nivel3
Prueba3	56780		12345	
Prueba2	45679	12345	
Prueba	12345
Gracias.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #2 (permalink)  
Antiguo 22/01/2013, 16:46
Avatar de RastaMart  
Fecha de Ingreso: noviembre-2006
Mensajes: 91
Antigüedad: 17 años, 5 meses
Puntos: 3
Respuesta: Select

Sinceramente no se si se pueda con mysql, pero a mi manera se puede hacer con un while con los resultados y dentro de ellos un if, para ir dando la forma a eso o en su caso un procedimiento almacenado, pero ahi si no tengo experiencia...
  #3 (permalink)  
Antiguo 22/01/2013, 16:51
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Select

jejeje si con php es facil hacer eso que quiero, pero el problema es que no tengo acceso a la parte de php, solo puedo hacer consultas y eso es lo que quiere el cliente asi que quedo

Gracias por tu respuesta... seguiremos a la espera de un milagro xD
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #4 (permalink)  
Antiguo 22/01/2013, 17:00
Avatar de RastaMart  
Fecha de Ingreso: noviembre-2006
Mensajes: 91
Antigüedad: 17 años, 5 meses
Puntos: 3
Respuesta: Select

Otra podría ser un pivote con mysql... has intentado eso?
  #5 (permalink)  
Antiguo 22/01/2013, 17:03
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Select

No, lo siento es la primera vez que escucho sobre ellas, tienes algún ejemplo a la mano de este tipo de consultas?
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #6 (permalink)  
Antiguo 22/01/2013, 17:20
Avatar de RastaMart  
Fecha de Ingreso: noviembre-2006
Mensajes: 91
Antigüedad: 17 años, 5 meses
Puntos: 3
Respuesta: Select

Mira tengo este ejemplo de pivote pero igual puedes investigar o pasarme tus tablas, haber que milagro podemos hacer jajaja

Este pivote hace la suma de acuerdo al estatus que tiene...

Código:
SELECT id_suc,sucursal, sum( is_PEN ) AS PENDIENTE, sum( is_IMP ) AS IMPRESO, sum( is_ENT ) AS ENTREGADO
                   FROM ( SELECT C.status, Suc.sucursal,Suc.id_suc,
		                CASE WHEN C.status = 'PENDIENTE' THEN 1 ELSE 0 END AS is_PEN,
			        CASE WHEN C.status = 'IMPRESO' THEN 1 ELSE 0 END AS is_IMP,
			        CASE WHEN C.status = 'ENTREGADO' THEN 1 ELSE 0 END AS is_ENT
			     FROM tblregistros AS C
			     LEFT JOIN tblCliente AS S ON S.cliente = C.cliente2
			     LEFT JOIN tblsucursal AS Suc ON Suc.id_suc = C.id_suc
			     WHERE activo = 'A' )x
		  GROUP BY sucursal ORDER BY id_suc

Este es el resultado..


No-------Sucursal----Totales-------Pendientes-------Impresos-------Entregados
1-------MAdrid-------4623-------8-------696-------3919
10-------España-------2656-------30-------274-------2352

Espero te ayude...
  #7 (permalink)  
Antiguo 22/01/2013, 17:51
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, 4 meses
Puntos: 2658
Respuesta: Select

Cita:
Iniciado por jonni09lo Ver Mensaje
Hola queria saber si solo con Mysql podria hacer lo siguiente:

Hago una consulta a la base de datos para 12345 y me retorna estos valores:

Código:
Nombre    CC    nivel1    nivel2    nivel3
Prueba3    56780    45679    12345    658488
Prueba2    45679    12345    658488
Prueba    12345    658488
Hay alguna forma de que en los datos de Prueba2 y Prueba3 en las columnas de nivel1, nivel2 y nivel3 solo se muestre el valor que estoy buscando, en este caso 12345, y que las otras columnas no aparezca nada?

Lo que espero retornar bajo la consulta seria algo como esto:

Código:
Nombre    CC    nivel1    nivel2    nivel3
Prueba3    56780        12345    
Prueba2    45679    12345    
Prueba    12345
Gracias.

Saludos
Técnicamente, se puede siempre y cuando ese valor lo obtengas en una subconsulta, o bien sea un parámetro pasado para el WHERE.
Pero si ese valor lo obtienes en la misma consulta, es demasiado complicado.
¿En qué contexto usas eso? ¿Cuál es el objetivo?
¿De dónde tomarías ese valor para usarlo?
__________________
¿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 22/01/2013, 17:52
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, 4 meses
Puntos: 2658
Respuesta: Select

Cita:
Iniciado por RastaMart Ver Mensaje
Otra podría ser un pivote con mysql... has intentado eso?
PIVOT es una cláusula propia de SQL Server (creo que hay algún otro que lo tiene).
No es parte del estándar ANSI-SQL, por lo que no es funcional en todos los DBMS, ni tampoco es reconocido por todas las librerías de acceso a BBDD.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 22/01/2013, 17:54
Avatar de RastaMart  
Fecha de Ingreso: noviembre-2006
Mensajes: 91
Antigüedad: 17 años, 5 meses
Puntos: 3
Respuesta: Select

El pivoteo lo he usado en PostgreSql y Mysql. Bueno eso dos he manejado.

Pero igual gracias por el aporte mi estimado.
  #10 (permalink)  
Antiguo 22/01/2013, 19:04
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, 4 meses
Puntos: 2658
Respuesta: Select

¿Y cómo has logrado usar PIVOT en MySQL?
La cláusula no existe en este DBMS, y para lograr lo mismo hay que manipular el SELECT "fabricando" las columnas de diversas formas... Yo lo he hecho, pero cuando llegas a cierta longitud de datos o cantidades de columnas, la cosa se vuelve muy ineficiente.
A mi entender es mucho más simple hacer un barrido cruzado con pocas lineas de programación. MUCHO más simple.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 22/01/2013, 19:10
Avatar de RastaMart  
Fecha de Ingreso: noviembre-2006
Mensajes: 91
Antigüedad: 17 años, 5 meses
Puntos: 3
Respuesta: Select

Esa consulta que mostre, es un pivoteo a menos que este mal en el concepto....

corrígeme si estoy mal.

Saludos.
  #12 (permalink)  
Antiguo 22/01/2013, 20:39
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, 4 meses
Puntos: 2658
Respuesta: Select

Bueno, precisamente a eso es que me refiero con "fabricar columnas".
De todos modos, yo que tu intentaría usarla así:
Código MySQL:
Ver original
  1.     Suc.id_suc,
  2.     Suc.sucursal,
  3.     SUM(C.`status` = 'PENDIENTE') Pendiente,
  4.     SUM(C.`status` = 'IMPRESO') Impreso,
  5.     SUM(C.`status` = 'ENTREGADO') Entregado
  6. FROM tblregistros C
  7.     LEFT JOIN tblCliente S ON S.cliente = C.cliente2
  8.     LEFT JOIN tblsucursal Suc ON Suc.id_suc = C.id_suc
  9. WHERE activo = 'A'
  10. GROUP BY sucursal
  11. ORDER BY id_suc;
Pruébala de esa forma y dime qué tal te resulta.

De todos modos, creo que no es el caso de lo que necesita @jonni09lo, ya que en el caso de él, ya tiene las tres columnas en la tabla, pero lo que quiere es que de todos los datos sólo se vean aquellos que sean iguales a un valor dado, y el resto, aunque tenga datos, se muestren vacíos.
O sea, esto:
Código MySQL:
Ver original
  1. Nombre    CC    nivel1    nivel2    nivel3
  2. Prueba3    56780    45679    12345    658488
  3. Prueba2    45679    12345    658488
  4. Prueba    12345    658488
En ese contexto, el problema es en realidad cómo determina él ese número, de dónde lo saca.
Porque en realidad, la consulta en si es sencila:
Código MySQL:
Ver original
  1.     Nombre,  
  2.     CC,  
  3.     IF(nivel1 = 12345, nivel1, '') nivel1,  
  4.     IF(nivel2 = 12345, nivel3, '') nivel2,  
  5.     IF(nivel3 = 12345, nivel3, '') nivel3
  6. FROM tabla;
pero la duda es esa: ¿de dónde sale ese numero para comparar?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #13 (permalink)  
Antiguo 23/01/2013, 07:40
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Select

Hola gracias por sus repuestas @gnzsoloyo el valor lo obtengo de una consulta normal, os voy a explicar, totalmente cual es el problema.

Tengo un aplicativo que me entregaron en Wordpress, y el tiene un plugin llamado DB-Toolkit, este plugin esta encargado de hacer aplicaciones que pueden hacer un CRUD fácilmente, sin necesidad de tirar código.

Como el plugin es el encargado de esto, no puedo acceder a programar php, porque esto podría dañar el plugin como tal, ademas ya he tratado de ver como hace las cosas y la verdad son demasiados archivos que hasta me termine perdiendo .

En este plugin se puede, en síntesis, programar el tipo de consulta a realizar, pero solo el sql, por esa razón postee esta pregunta, el plugin se encarga de mostrar el formulario, de hacer la búsqueda y de organizar los datos.

Saludos y Gracias
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #14 (permalink)  
Antiguo 23/01/2013, 10:37
Avatar de RastaMart  
Fecha de Ingreso: noviembre-2006
Mensajes: 91
Antigüedad: 17 años, 5 meses
Puntos: 3
Respuesta: Select

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Bueno, precisamente a eso es que me refiero con "fabricar columnas".
De todos modos, yo que tu intentaría usarla así:
Código MySQL:
Ver original
  1.     Suc.id_suc,
  2.     Suc.sucursal,
  3.     SUM(C.`status` = 'PENDIENTE') Pendiente,
  4.     SUM(C.`status` = 'IMPRESO') Impreso,
  5.     SUM(C.`status` = 'ENTREGADO') Entregado
  6. FROM tblregistros C
  7.     LEFT JOIN tblCliente S ON S.cliente = C.cliente2
  8.     LEFT JOIN tblsucursal Suc ON Suc.id_suc = C.id_suc
  9. WHERE activo = 'A'
  10. GROUP BY sucursal
  11. ORDER BY id_suc;
Pruébala de esa forma y dime qué tal te resulta.

De todos modos, creo que no es el caso de lo que necesita @jonni09lo, ya que en el caso de él, ya tiene las tres columnas en la tabla, pero lo que quiere es que de todos los datos sólo se vean aquellos que sean iguales a un valor dado, y el resto, aunque tenga datos, se muestren vacíos.
O sea, esto:
Código MySQL:
Ver original
  1. Nombre    CC    nivel1    nivel2    nivel3
  2. Prueba3    56780    45679    12345    658488
  3. Prueba2    45679    12345    658488
  4. Prueba    12345    658488
En ese contexto, el problema es en realidad cómo determina él ese número, de dónde lo saca.
Porque en realidad, la consulta en si es sencila:
Código MySQL:
Ver original
  1.     Nombre,  
  2.     CC,  
  3.     IF(nivel1 = 12345, nivel1, '') nivel1,  
  4.     IF(nivel2 = 12345, nivel3, '') nivel2,  
  5.     IF(nivel3 = 12345, nivel3, '') nivel3
  6. FROM tabla;
pero la duda es esa: ¿de dónde sale ese numero para comparar?



Orale, no sabia que se podia poner If dentro de un Select, Gracias por el aporte...

Igual deja probar la consulta que me enviaste y vere el rendimiento...

Gracias mi estimado, lo curioso es que en vez de ayudar sali beneficiado... jajaja
  #15 (permalink)  
Antiguo 23/01/2013, 10:57
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, 4 meses
Puntos: 2658
Respuesta: Select



Es lo bueno de resolver las cosas en forma pública, y compartir lo que se hizo.

__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #16 (permalink)  
Antiguo 23/01/2013, 12:17
Avatar de RastaMart  
Fecha de Ingreso: noviembre-2006
Mensajes: 91
Antigüedad: 17 años, 5 meses
Puntos: 3
Respuesta: Select

Mi estimado gnzsoloyo con relación a tu consulta, ya estuve haciendo pruebas pero no se ve mucha diferencia... Pero lo deje en esa que me pasaste, para ver que tal se comporta..

Muchas Gracias.
  #17 (permalink)  
Antiguo 23/01/2013, 12:31
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, 4 meses
Puntos: 2658
Respuesta: Select

La idea era precisamente que no hubiese diferencias, pero con una resolucion de más simplicidad para el parser.
La cosa es evitar en lo posible el uso de funciones innecesarias, y lo que estabas haciendo podía ser poco performántico llegado el caso de tablas muy grandes. En pocos registros (algunos miles), no vas a encontrar diferencia sustanciales.
Para mayor claridad, cuando haces una evaluación lógica (A>B, A=B, etc.), la operacion siempre devuelve un entero que representa TRUE (1) o FALSE (0), por lo que en tu contexto podías usar eso sólo para sumar. Es un modo más simple de lograr lo mismo.
En cambio el uso de CASE (que es mejor evitar a menos que sea totalmente necesario), realiza comparaciones más complejas, que no se necesitaban.
De allí mi proposición.

Me alegro que funcionara, porque era medio un experimento.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #18 (permalink)  
Antiguo 23/01/2013, 13:06
Avatar de RastaMart  
Fecha de Ingreso: noviembre-2006
Mensajes: 91
Antigüedad: 17 años, 5 meses
Puntos: 3
Respuesta: Select

Ok. Bien bien ahora entiendo. Pero gracias por tu ayuda. Aunque la persona que esta solicitando ayuda no aparece jaja.


Estoy muy agradecido por tu ayuda mi estimado.

Etiquetas: select, 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 21:54.