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

GROUP BY, patrones y quebraderos de cabeza.

Estas en el tema de GROUP BY, patrones y quebraderos de cabeza. en el foro de Mysql en Foros del Web. Hola amigos, Me estoy volviendo loco con un tema a ver si me podeis hechar una mano. Es una pagina que lista los clientes chungos ...
  #1 (permalink)  
Antiguo 24/04/2009, 07:17
 
Fecha de Ingreso: abril-2009
Mensajes: 2
Antigüedad: 15 años
Puntos: 0
GROUP BY, patrones y quebraderos de cabeza.

Hola amigos,

Me estoy volviendo loco con un tema a ver si me podeis hechar una mano.

Es una pagina que lista los clientes chungos de una aseguradora (muchos campos, muchos 'wheres' pero en el fondo.. un listado normal). Ahora me piden que, si hay distintos clientes con una dolencia sólo aparezca la dolencia una vez en el listado y luego al clicar se desplieguen el resto de clientes con esta misma dolencia... para que nos entengamos:

Tengo un campo 'dolencia'. En la mayoria de registros este campo aparece vacío, pero puede ser que 30 clientes tengan una 'dolencia' = 5 y 20 una 'dolencia' = 3. ¿Como debería ser la query para que me agrupara los usuarios que tienen una dolencia concreta pero me listara TODOS los usuarios que no tienen dolencia?

Lo consigo parcialmente con GROUP BY 'dolencia' pero entonces entiende todos los registros con 'dolencia' vacíos como un solo grupo y no quiero esto. Lo quiero para el resto (3 y 5).

Me explico fatal!
En fin, supongo que tengo excusa, que es mi primer POST. ;)

Gracias a todos!
  #2 (permalink)  
Antiguo 24/04/2009, 08:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: GROUP BY, patrones y quebraderos de cabeza.

Sin entrar a discutir la estructura de la base. Deberías decirnos si esa dolencia es un campo de tipo numérico o varchar, si permites o no null. También si guardas más de una dolencia en ese campo, separando con comas, etc. No obstante, te aconsejo que pruebes esto.

si es varchar
SELECT idcliente where dolencia like "";
si es numérico y no permites null:
SELECT idcliente WHERE dolencia = 0;
si es numérico y permites null:
SELECT idcliente WHERE dolencia IS NULL;
cualquiera de esas consultas, según la naturaleza del campo, debería mostrarte los que no sufren ninguna dolencia. Pero tendrías que precisarnos si en ese campo queda en blanco o vacío, o si permites NULL.

Para buscar los que sufren alguna dolencia te bastará algo como esto
SELECT idcliente WHERE dolencia = 3;


Imagino que esa estructura será la que es por alguna razón: sólo una dolencia por cliente.

Cita:
¿Como debería ser la query para que me agrupara los usuarios que tienen una dolencia concreta pero me listara TODOS los usuarios que no tienen dolencia?
busca así:
SELECT idcliente, IF(dolencia = "", "sin dolencia", dolencia ) dolencia FROM tabla WHERE dolencia = 3 OR dolencia LIKE "" ORDER BY dolencia DESC, idcliente;

Pero tendrías que darnos datos sobre el tipo de campo que es dolencia y los datos que sueles introducir.

Esa es la idea.

Última edición por jurena; 24/04/2009 a las 09:01
  #3 (permalink)  
Antiguo 24/04/2009, 13:06
 
Fecha de Ingreso: abril-2009
Mensajes: 2
Antigüedad: 15 años
Puntos: 0
Respuesta: GROUP BY, patrones y quebraderos de cabeza.

Es que no es exactamente esto lo que quiero. Os pongo un ejemplo más visual:

Tengo a 5 tíos con dolencias y 3 sin dolencias.

Roberto = Gripe
Anna = Resfriado
David = Contractura
Pedro= Resfriado
Jaime = Gripe
Ramon = ''
Pepa = ''
Miriam = ''

Lo que yo quiero es, en una sola query, que me muestre los nombres agrupados por dolencias.

En este caso sería fácil:
SELECT nombre, dolencia FROM clientes GROUP BY dolencia;

y devolvería algo así:
Roberto, Gripe
Anna, Resfriado
David, Contractura
Ramon,

Lo que yo quiero es esto, però en los casos en que el cliente no tenga dolencia enumere todos los clientes. Quiero conseguir que liste esto:

Roberto, Gripe
Anna, Resfriado
David, Contractura
Ramon,
Pepa,
Miriam,

A lo mejor no se puede... reconozco que es un poco raro pero seguro que hay alguna forma de conseguir esto..
  #4 (permalink)  
Antiguo 26/04/2009, 08:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: GROUP BY, patrones y quebraderos de cabeza.

Ponnos la estructura de tus tablas y la naturaleza de tus campos. Dinos más exactamente lo que quieres con más datos, y te haremos una propuesta. Pon un ejemplo concreto, aclarando qué significa para ti que los nombres estén agrupados por dolencia: ¿quieres decir que una sola consulta te ofrezca en una lista todos los que sufren gripe, luego los que sufren resfriado y finalmente contractura, y a continuación los que no sufren dolencia alguna, o qué? Todo ese tipo de consultas puede hacerse, pero necesitamos saber exactamente lo que quieres, pues yo no acabo de ver todos los detalles.

Última edición por jurena; 26/04/2009 a las 08:06
  #5 (permalink)  
Antiguo 26/04/2009, 09:41
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: GROUP BY, patrones y quebraderos de cabeza.

Spotnick.

Según te entiendo, en el campo dolencias guardas o la dolencia o un espacio vacio.

Lo que pides lo puedes hacer con:

Código mysql:
Ver original
  1. select nombre,dolencia from clientes group by dolencia
  2. select nombre,dolencia from clientes where dolencia = '' order by dolencia;
Los clientes que no tengan dolencia, si lo que existe es un null y no un vacio, sería:

Código mysql:
Ver original
  1. select nombre,dolencia from clientes group by dolencia
  2. select nombre,dolencia from clientes where dolencia is null order by dolencia;

Esto te lista un registro que agrupado por dolencia, mas todos aquellos que no tienen dolencias.

espero que te sirva.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
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 04:23.