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

Dos count para una misma lista

Estas en el tema de Dos count para una misma lista en el foro de Mysql en Foros del Web. Hola a todos Tengo una tabla tal que: id_User Estado Tarea 1 OK Escribir libro 5 OK Cocinar arroz 5 Pendiente Pintar cuadro 4 Pendiente ...
  #1 (permalink)  
Antiguo 22/11/2013, 15:15
 
Fecha de Ingreso: marzo-2013
Mensajes: 83
Antigüedad: 11 años, 1 mes
Puntos: 0
Dos count para una misma lista

Hola a todos

Tengo una tabla tal que:

id_User Estado Tarea
1 OK Escribir libro
5 OK Cocinar arroz
5 Pendiente Pintar cuadro
4 Pendiente cantar canción
.
.

Y quiero obtener un resultado como este:

User OK Pendientes
Jose 1 0
Maria 1 1
.
.
.

Lo máximo que me he acercado es teniendo el de OK correcto pero el de pendientes todos con la suma de todos con la siguiente consulta

Código SQL:
Ver original
  1. SELECT CONCAT(U.Nombre,' ',U.PrimerApellido) USER, COUNT(*) OK,
  2.     (SELECT COUNT(*) Pendientes
  3.         FROM tareas T
  4.         LEFT JOIN Usuarios U ON U.id_User=T.id_User
  5.         WHERE T.Estado='Pendientes'
  6.     )R
  7. FROM tareas T
  8. LEFT JOIN Usuarios U ON U.id_User=T.id_User
  9. WHERE T.Estado='OK'
  10. GROUP BY USER

Así pues, mi pregunta es...¿Cómo podría conseguirlo?
  #2 (permalink)  
Antiguo 22/11/2013, 15:54
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Dos count para una misma lista

Hola joselegolas:

Este tipo de consultas es uno de los ejemplos típicos que se hacen cuando comienzas a aprender SQL... en realidad hay muchas formas de obtenerlo y en la red hay muchísimos ejemplos... en este mismo foro hemos tratado infinidad de veces este tipo de consultas, por lo que te sugiero que para la próxima te tomes un poco más de tiempo para preguntarle a SAN GOOGLE, el es muy sabio y generalmente tiene la respuesta a lo que sea que preguntes jejejejejeje...

La manera más simple es con sumas condicionales, que son especie de contadores en programación... supongo que habrás visto muchas veces algo como esto:

Código:
Total = Total + 1
Al colocar esto dentro de un ciclo, lo que haces es contar el número de veces que se ejecuta el ciclo... En este caso, utilizas el mismo principio para 'contar' cada uno de los estados... cada que encuentres un estado con OK para un usuario en particular Sumas un 1 al resultado total... esto debes hacerlo para TODOS LOS ESTADOS QUE EXISTEN EN TU TABLA... sería algo más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla;
  2. +----------+-----------+-----------------+
  3. | usuario  | estado    | tarea           |
  4. +----------+-----------+-----------------+
  5. | José     | OK        | Escribir libro  |
  6. | María    | OK        | Cocinar arroz   |
  7. | María    | Pendiente | Pintar cuadro   |
  8. | Leonardo | Pendiente | cantar canción  |
  9. +----------+-----------+-----------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT
  13.     ->    usuario,
  14.     ->    SUM(IF(estado = 'OK', 1, 0)) total_ok,
  15.     ->    SUM(IF(estado = 'Pendiente', 1, 0)) total_pendiente
  16.     -> FROM tabla
  17.     -> GROUP BY usuario;
  18. +----------+----------+-----------------+
  19. | usuario  | total_ok | total_pendiente |
  20. +----------+----------+-----------------+
  21. | José     |        1 |               0 |
  22. | Leonardo |        0 |               1 |
  23. | María    |        1 |               1 |
  24. +----------+----------+-----------------+
  25. 3 rows in set (0.00 sec)

En tu post no nos dices de dónde obtienes los nombres de los usuarios... puedo suponer que los tienes en una tabla aparte... lo único que tendrías que hacer es un JOIN con esa tabla para obtener el resultado tal como lo quieres.

Saludos
Leo.

Etiquetas: count, múltiple
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 01:46.