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

Select count(*)

Estas en el tema de Select count(*) en el foro de Mysql en Foros del Web. Hola a todos!! Quisiera me pudieran ayudar con algo que me tiene como loco! Tengo una BD llamada administrativos : Campos: | id | usuario ...
  #1 (permalink)  
Antiguo 12/02/2015, 21:49
 
Fecha de Ingreso: diciembre-2014
Mensajes: 72
Antigüedad: 9 años, 4 meses
Puntos: 0
Exclamación Select count(*)

Hola a todos!!


Quisiera me pudieran ayudar con algo que me tiene como loco!

Tengo una BD llamada administrativos :

Campos: | id | usuario | area 1 | area 2 | area 3| area 4 |

| 1001 | juan | SI | NO | SI | NO |
| 1002 | jose | SI | SI | SI | SI |
| 1003 | omar | NO | SI | SI | NO |
| 1004 | mario | SI | SI | NO | NO |
| 1005 | pedro | NO | NO | SI | SI |

Esta tabla es para saber si el usuario tiene acceso o no a cierta area.

Pero bueno, mi duda es en la syntaxis de como usar el select count(*)

para contar cuantas veces se repite "si" en cierta fila y de esta forma saber a cuantas areas tiene acceso el usuario

Ej
juan - 2
jose - 4
omar - 3

QUISE INTENTARLO ASI PERO NO LOGRE NADA, ESPERO ME PUEDAN AYUDAR, GRACIAS

Código SQL:
Ver original
  1. SELECT COUNT("SI")* FROM administrativos WHERE usuario='$user'
Cita:
Editado: Código de programación no permitido en foros de Bases de Datos.
Leer las normas del foro, por favor.

Última edición por gnzsoloyo; 12/02/2015 a las 21:58
  #2 (permalink)  
Antiguo 12/02/2015, 22:01
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, 5 meses
Puntos: 2658
Respuesta: Select count(*)

COUNT() aplica sobre grupos de registros, no sirve para contar valores entre campos del mismo registro.
DE hecho, en tu caso tienes la tabla mal diseñada, porque si un administrativo puede tener permisos o acceso a N áreas, y cada área puede tener N administrativos relacionados, lo que se requiere es tres tablas: Una para los administrativos, otra para las áreas y una que relacione ambas.
Cualquier otra solución es ineficiente e incorrecta.
En caso de tenerla así la consulta se volvería muy 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)
  #3 (permalink)  
Antiguo 12/02/2015, 22:13
 
Fecha de Ingreso: diciembre-2014
Mensajes: 72
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Select count(*)

Claro entiendo que no es la mejor solucion de tabla pero me sirvio para dar acceso a cierto menu para cada administrador y me ha servido, mejorare esa parte para tener mas orden en mi codigo.

Pero por las prisas que tengo ya que es un proyecto escolar, quisiera saber si hay algun modo de saber cuantas veces se repite una palabra.

El fin de semana tendre tiempo para modificar las tablas pero nose si exista algun modo de contar palabras repetidas.

Saludos
  #4 (permalink)  
Antiguo 12/02/2015, 22:23
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, 5 meses
Puntos: 2658
Respuesta: Select count(*)

Cómo te dije, las funciones de agregación no aplican a campos de un mismo registro, sino a columnas entre registros.
Lo que quieres hacer es mas simple programando, ya que hacerlo en SQL implica crear stored procedures que hagan lo mismo que los lenguajes de programación hacen mejor.
En cuanto a que la tabla así re haya resultado útil, eso no quiere decir que este bien o sea eficiente. No lo es, solo que no lo has notado porque trabajas con pocos datos. Pero con más... lo notarás.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/02/2015, 22:31
 
Fecha de Ingreso: diciembre-2014
Mensajes: 72
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Select count(*)

Claro lo corregire por la parte de aprender como se debe hacerlo ya que unicamnete la funcion de esto es habilitar o no el acceso a un menu.

No es la gran cosa pero ya me dieron otro proyecto en donde creo que si lo notare como dices, asiq ue mejor ire viendo esa parte que mencionas.

agradezco tus comentarios
  #6 (permalink)  
Antiguo 13/02/2015, 09:15
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Select count(*)

Hola mbrisenog:

Creo que ya gnzsoloyo te comentó por qué razón el modelo que tienes no es eficiente, además me gustaría agregar un comentario adicional.

No es conveniente que guardes valores como SI y NO en un campo VARCHAR... esto porque un campo VARCHAR te permite capturar cualquier valor (independientemente de que tú como programador "valides" que sólo capture estos valores).

Lo correcto es hacerlo por catálogos, es decir, tener algo como esto:

Código:
tabla_boleanos:

id|descripcion
-------------------
1|SI
2|NO
De tal manera que en tu tabla de permisos MANEJAS EL ID, no la descripción. Esto pareciera que complica las cosas, pues no parece muy "eficiente" tener una tabla sólo con dos estados, pero te aseguro que en la práctica, esto te quita bastantes dolores de cabeza.

Ahora, volviendo a tu problema original, hay una forma de hacer el conteo, y sería haciendo una suma condicional, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT id, usuario, area1, area2 FROM tabla;
  2. +------+---------+-------+-------+
  3. | id   | usuario | area1 | area2 |
  4. +------+---------+-------+-------+
  5. | 1001 | juan    | SI    | NO    |
  6. | 1002 | jose    | SI    | SI    |
  7. | 1003 | omar    | NO    | SI    |
  8. | 1004 | mario   | SI    | SI    |
  9. | 1005 | pedro   | NO    | NO    |
  10. +------+---------+-------+-------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT
  14.     ->    id,
  15.     ->    usuario,
  16.     ->    area1,
  17.     ->    area2,
  18.     ->    IF(area1 = 'SI', 1, 0) + IF(area2 = 'SI', 1, 0) total_si
  19.     -> FROM tabla;
  20. +------+---------+-------+-------+----------+
  21. | id   | usuario | area1 | area2 | total_si |
  22. +------+---------+-------+-------+----------+
  23. | 1001 | juan    | SI    | NO    |        1 |
  24. | 1002 | jose    | SI    | SI    |        2 |
  25. | 1003 | omar    | NO    | SI    |        1 |
  26. | 1004 | mario   | SI    | SI    |        2 |
  27. | 1005 | pedro   | NO    | NO    |        0 |
  28. +------+---------+-------+-------+----------+
  29. 5 rows in set (0.00 sec)

Aquí tendrías que agregar tantos IF's como áreas tengas en tu tabla, es por lo que comentaba gnzsoloyo que el modelo es ineficiente.

Saludos
Leo.

Etiquetas: campo, select, sql, tabla
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 13:35.