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

SELECT COUNTS 2 tablas

Estas en el tema de SELECT COUNTS 2 tablas en el foro de Mysql en Foros del Web. Wenas,, Estoy con un problema con una consulta SQL: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $sql = "SELECT COUNT(titulo_conferencistas.titulo) as CANT, COUNT(personas.Nombre), personas.*,titulo_conferencistas.* FROM personas ...
  #1 (permalink)  
Antiguo 21/06/2012, 09:41
Avatar de Maganius  
Fecha de Ingreso: septiembre-2010
Mensajes: 310
Antigüedad: 14 años, 4 meses
Puntos: 10
SELECT COUNTS 2 tablas

Wenas,,

Estoy con un problema con una consulta SQL:

Código PHP:
Ver original
  1. $sql = "SELECT COUNT(titulo_conferencistas.titulo) as CANT, COUNT(personas.Nombre), personas.*,titulo_conferencistas.* FROM personas JOIN titulo_conferencistas ON personas.ID_Personas=titulo_conferencistas.IDPersona WHERE $filtro GROUP BY personas.ID_Personas ".$Order.";";

Lo que intento hacer es que me diga cuantos Titulos tengo y cuantas Personas tengo.

Pero si pongo el GROUP BY me muestra 2 y si lo saco me muestra la cantidad de registros que tengo en titulo_conferencistas

¿Como puedo realizar una consulta donde me muestre en PHP la cantidad de registros que hay en cada tabla?

Lo tengo que hacer en 1 consulta ya que realizo un filtro y esa cantidad varia dependiendo del filtro que se halla realizado
  #2 (permalink)  
Antiguo 21/06/2012, 10:04
 
Fecha de Ingreso: septiembre-2005
Mensajes: 840
Antigüedad: 19 años, 5 meses
Puntos: 84
Respuesta: SELECT COUNTS 2 tablas

tendras que hacer las 2 consultas separadas, primero para sacar cuantos hay de un tipo, y despues sacar cuantos hay del otro.

Un saludo =)
__________________
» Presupuesto Pagina Web
  #3 (permalink)  
Antiguo 21/06/2012, 10:08
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 11 meses
Puntos: 47
Respuesta: SELECT COUNTS 2 tablas

Hola, por empezar cuando usas GROUP BY no se puede usar WHERE debes usar HAVING y el HAVING va despues del GROUP BY, el HAVING hace lo mismo que el WHERE pero debe usarse cuando usas GROUP BY x ejemplo:

Código PHP:
Ver original
  1. $sql = "SELECT COUNT(titulo_conferencistas.titulo) as CANT, COUNT(personas.Nombre), personas.*,titulo_conferencistas.* FROM personas JOIN titulo_conferencistas ON personas.ID_Personas=titulo_conferencistas.IDPersona GROUP BY personas.ID_Personas HAVING $filtro $Order;";

Tambien recuerda que las comillas dobles de php interpretan variables por lo cual no es necesario concatenar ;).

Saludos
  #4 (permalink)  
Antiguo 21/06/2012, 10:44
Avatar de Maganius  
Fecha de Ingreso: septiembre-2010
Mensajes: 310
Antigüedad: 14 años, 4 meses
Puntos: 10
Respuesta: SELECT COUNTS 2 tablas

Gracias por contestar miSko

No puedo hacer las 2 consultas ya que utilizo un filtro y dependiendo si esta filtrado o no la cantidad de titulos y conferencistas hay..

Gracias por contestar djaevi

Entiendo, gracias por tu explicación
  #5 (permalink)  
Antiguo 21/06/2012, 11:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 18 años, 1 mes
Puntos: 447
Respuesta: SELECT COUNTS 2 tablas

Hola a todos:

Creo que aquí tenemos varios errores de conceptos de SQL que es necesario aclarar.

Maganius nos dice en el primer post:

Código:
Lo que intento hacer es que me diga cuantos Titulos tengo 
y cuantas Personas tengo.
En primer lugar deberías comenzar por decirnos si las tablas tienes relación, si es así cómo están relacionados los datos, poner algunos datos de ejemplo y decirnos qué es lo que pretendes obtener... veamos este ejemplo para ver si es más o menos lo que quieres. Supongamos que tenemos estas dos tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA;
  2. +------+-------------+
  3. | idA  | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. |    4 | cuatro      |
  9. +------+-------------+
  10. 4 rows in set (0.02 sec)
  11.  
  12. mysql> SELECT * FROM tablaB;
  13. +------+------+
  14. | idB  | idA  |
  15. +------+------+
  16. |    1 |    1 |
  17. |    2 |    3 |
  18. |    3 |    4 |
  19. |    3 |    5 |
  20. +------+------+
  21. 4 rows in set (0.00 sec)

Observa que en ambas tablas hay 4 elementos, pero en la tablaB sólo hay tres que están relacionados con la tablaA (el idA = 5 no existe en la tablaA)... si quisieras obtener el total de elementos de la TablaA y el total de elementos relacionados en la tablaB podrías hacerlo así:

Código MySQL:
Ver original
  1. mysql> SELECT SUM(1) total_a, SUM(IF(B.idA IS NOT NULL, 1, 0)) total_b
  2.     -> FROM tablaA A LEFT JOIN tablaB B ON A.idA = B.idA;
  3. +---------+---------+
  4. | total_a | total_b |
  5. +---------+---------+
  6. |       4 |       3 |
  7. +---------+---------+
  8. 1 row in set (0.01 sec)

Si las tablas en realidad no guardan ninguna relación, pero quisieras obtener ambos totales en una sola consulta podrías hacerlo con dos subconsultas:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> (SELECT COUNT(*) FROM tablaA) total_a,
  3.     -> (SELECT COUNT(*) FROM tablaA) total_b;
  4. +---------+---------+
  5. | total_a | total_b |
  6. +---------+---------+
  7. |       4 |       4 |
  8. +---------+---------+
  9. 1 row in set (0.01 sec)

Pero te repito, para necesitas darnos más información acerca de tus tablas y tus datos para poder darte una respuesta más puntual:

Segundo, djaevi en su post nos dice esto:

Cita:
por empezar cuando usas GROUP BY no se puede usar WHERE debes usar HAVING y el HAVING va despues del GROUP BY, el HAVING hace lo mismo que el WHERE pero debe usarse cuando usas GROUP BY
Esto es completamente FALSO... creo que estamos entendiendo mal cómo funcionan estás cláusulas: son dos cosas muy distintas el WHERE y el HAVING, aunque puede parecer que tienen la misma función. SI PUEDES UTILIZAR LA CLÁUSULA WHERE en una consulta donde utilices GROUP BY... esta simplemente sirve para filtrar la información que deseas agrupar, la cláusula HAVING se aplica después del GROUP BY y debería hacer referencia justamente a columnas del group by o que tengan que ver con funciones de agregación... en la documentación aparecen esto de manera clara:

http://dev.mysql.com/doc/refman/5.0/es/select.html

De tal suerte que tu podrías utilizar sin ningún problema sólo la cláusula where, sólo la cláusula HAVING o AMBAS:

Código MySQL:
Ver original
  1. mysql> SELECT count(*) FROM tablaB WHERE idB > 2 GROUP BY idB;
  2. +----------+
  3. | count(*) |
  4. +----------+
  5. |        2 |
  6. +----------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> select count(*) from tablaB GROUP BY idB HAVING COUNT(*) >= 1;
  10. +----------+
  11. | count(*) |
  12. +----------+
  13. |        1 |
  14. |        1 |
  15. |        2 |
  16. +----------+
  17. 3 rows in set (0.00 sec)
  18.  
  19. mysql> SELECT count(*) FROM tablaB WHERE idB > 1 GROUP BY idB
  20.     -> HAVING COUNT(*) > 1;
  21. +----------+
  22. | count(*) |
  23. +----------+
  24. |        2 |
  25. +----------+
  26. 1 row in set (0.00 sec)

Lo que NO PUEDES HACER ES ALGO COMO ESTO:

Código:
SELECT count(*) FROM tablaB WHERE idB > 1 AND COUNT(*) > 1;
Es decir, utilizar funciones de agregación en el WHERE ni tampoco deberías hacer esto:

Código:
SELECT count(*) FROM tablaB  GROUP BY idB
    -> HAVING COUNT(*) > 1 AND idA = 1; 
es decir, involucrar campos que no intervengan en el GROUP BY en la sección HAVING.

Saludos
Leo.
  #6 (permalink)  
Antiguo 21/06/2012, 11:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años, 2 meses
Puntos: 2658
Respuesta: SELECT COUNTS 2 tablas

Cita:
Iniciado por Maganius Ver Mensaje
Wenas,,

Estoy con un problema con una consulta SQL:

Código PHP:
Ver original
  1. $sql = "SELECT COUNT(titulo_conferencistas.titulo) as CANT, COUNT(personas.Nombre), personas.*,titulo_conferencistas.* FROM personas JOIN titulo_conferencistas ON personas.ID_Personas=titulo_conferencistas.IDPersona WHERE $filtro GROUP BY personas.ID_Personas ".$Order.";";

Lo que intento hacer es que me diga cuantos Titulos tengo y cuantas Personas tengo.

Pero si pongo el GROUP BY me muestra 2 y si lo saco me muestra la cantidad de registros que tengo en titulo_conferencistas

¿Como puedo realizar una consulta donde me muestre en PHP la cantidad de registros que hay en cada tabla?

Lo tengo que hacer en 1 consulta ya que realizo un filtro y esa cantidad varia dependiendo del filtro que se halla realizado
La pregunta central es: ¿Están realmente relacionadas esas dos tablas, tal cmo planteas la consulta?
Por lo que parece, estás contando estás contando por un lado cuántos conferencistas hay registrados, y por otro cuántas conferencias distintas se dieron, agrupados por cada conferencista.
Son criterios algo disimiles, porque contar los conferencistas que tienes no tienen ninguna utilidad si los agrupas por conferencista. Eso haría que el resultado de la cuenta de conferencistas sea siempre uno (1).
En todo caso, piénsalo así:
Puedes agrupar por conferencista, y la cantidad de ellos será igual a la cantidad de registros devueltos (ese COUNT() es irrelevante), mientras que el COUNT de títulos te dirá cuántos títulos ha tenido que dar.
Si el mismo conferencista da varias veces la misma conferencia, y quieres saber cuantas veces dio cada una, esa consulta no te sirve, porque está mal agrupada.

Quita el primer COUNT() y usa la cantidad de registros devueltos.

Nota: Es muy difícil aconsejarte sobre consultas que dependen de variables, porque para nosotros las variables son basura que altera el resultado de formas impredecibles.
En este foro no tratamos con código de programación, sólo SQL (normas del Foro)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: registro, select, sql, tabla, tablas
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 09:26.