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

Consulta con dos Count

Estas en el tema de Consulta con dos Count en el foro de Mysql en Foros del Web. Hola a todos, necesito hacer una consulta que me muestre la suma de dos campos. Las tablas son las siguientes: (2 Registros) Tabla Retos idReto ...
  #1 (permalink)  
Antiguo 16/05/2011, 04:58
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 18 años, 4 meses
Puntos: 1
Consulta con dos Count

Hola a todos,

necesito hacer una consulta que me muestre la suma de dos campos.
Las tablas son las siguientes:

(2 Registros)
Tabla Retos
idReto 1
idUserGanador 1
idReto 2
iduserGanador 1

3 Registros
Tabla Torneos
idTorneo 1
idUserGanador 1
idTorneo 2
idUserGanador 1
idTorneo 3
idUserGanador 2

Pues bien, si yo quiero obtener los retos y torneos que el usuario 1 ha ganado pongo:

SELECT COUNT(retos.idUserGanador), COUNT(social_torneos.idUserGanador) FROM retos INNER JOIN social_torneos ON social_torneos.idUserGanador=retos.iduserGanador
WHERE retos.idUserGanador = 1

Pues debería salirme Retos 2 torneos 2 y me muestra 4 y 4.
¿Por qué me pasa esto?, ¿Cómo creo la consulta para que me devuelva los retos y torneos ganados por ese usuario?

Un saludo.
  #2 (permalink)  
Antiguo 16/05/2011, 05:47
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: Consulta con dos Count

Es normal que te salga cuatro y cuatro, estás uniendo la tabla por un campo que no es FK de una en la otra, por lo que te sale cada uno dos veces (tantas veces registros de la segunda tabla como haya de la primera) ya que hace el producto cartesiano.

¿La tabla retos y la tabla torneos están relacionadas? Si no, deberías usar un UNION, no un INNER JOIN
  #3 (permalink)  
Antiguo 16/05/2011, 06:03
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 18 años, 4 meses
Puntos: 1
Respuesta: Consulta con dos Count

Pues directamente no están relacionadas,

la tabla retos tiene como clave primaria el campo idReto y la tabla torneos tiene como clave primaria el campo idTorneo.

Pero ambas tablas tienen un campo idUserGanador que está relacionado con la tabla usuarios. Y esta tabla, usuarios, tiene clave primaria idUsuario. Es decir, que intento pillar este campo, idUsuario relacionado con retos y torneos para realizar el INNER JOIN.

Igual puedo usarla de puente para hacer el INNER. O eso es lo que quiero.

Yo lo que quiero son dos campos como resultado con la suma de retos y torneos ganados por un usuario X.

si la tablas tienen estos datos:

(2 Registros)
Tabla Retos
idReto 1
idUserGanador 1
idReto 2
iduserGanador 1

3 Registros
Tabla Torneos
idTorneo 1
idUserGanador 1
idTorneo 2
idUserGanador 1
idTorneo 3
idUserGanador 2

Tabla Usuarios
idUsuario 1
nombre Pepe
idUsuario 2
nombre Juan
idUsuario 3
nombre Jaime

¿no puedo usar la tabla usuarios para obtener el número de retos y torneos ganados por Pepe?

Prefiero usar el INNER JOIN, si es posible a la UNION.


Graicas y un saludo.
  #4 (permalink)  
Antiguo 16/05/2011, 06:14
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: Consulta con dos Count

Cita:
Pues directamente no están relacionadas,
Si no están relacionadas no puedes usar INNER JOIN porque el resultado es irracional. Estarías mezclando cosas incompatibles; como quien quiere saber cuantas facturas y remitos tiene un cliente, pero para ello hace un INNER JOIN entre el detalle de las facturas y los remitos. No son cosas que tengan una relación 1:1, por lo que la cuenta da cualquier cosa.
El error es que si lo que quieres es contar los torneos y retos en que intervino un usuario, lo que tienes que relacionar es a los Usuarios con los Retos y con los Torneos, y no usando INNER JOIN sino LEFT JOIN, ya que uno de ellos puede dar NULL en algún momento.
Algo como:
Código MySQL:
Ver original
  1.     U.idUsuario,
  2.     U.nombreUsuario,
  3.     COUNT(T.idTorneo) TorneosGanados,
  4.     COUNT(R.idReto) RetosRealizados
  5.     Usuarios U
  6.     LEFT JOIN Torneos T ON U.idUser = T.idUserGanador
  7.     LEFT JOIN Retos R ON U.idUser = R.idUserGanador;

Recuerda: Si dos tablas se vinculan a una tercera, no implica necesariamente que se vinculen entre sí. Sólo existe transitividad si los registros de ambas tienen efectivamente alguna relación, es decir, si Torneos dependiese de Retos o viceversa.
__________________
¿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 16/05/2011, 06:49
 
Fecha de Ingreso: noviembre-2005
Ubicación: Alicante (España)
Mensajes: 242
Antigüedad: 18 años, 4 meses
Puntos: 1
Respuesta: Consulta con dos Count

Entiendo gnzsoloyo,

ahora me valdría lo que dices. Pero la consulta que me has pasado no funciona en mysql porque, según el motor, me dice que debo utilizar un group by si utilizo un count con más campos en el select.

He puesto, al final, group by T.idTorneo, R.idReto pero no sale bien. Me muestra los registros individuales y no realiza el count de los retos y torneos ganados por el usuario 1.

Yo, para el ejemplo que he escrito:

(4 Registros)
Tabla Retos
idReto 1
idUserGanador 1
idReto 2
idUserGanador 1
idReto 3
idUserGanador 1
idReto 4
idUserGanador 2

3 Registros
Tabla Torneos
idTorneo 1
idUserGanador 1
idTorneo 2
idUserGanador 1
idTorneo 3
idUserGanador 2

Tabla Usuarios
idUsuario 1
nombre Pepe
idUsuario 2
nombre Juan
idUsuario 3
nombre Jaime

necesito que me devuelva:

Resultado:
idUsuario 1
nombre Pepe
TorneosGanados 2
Retos Ganados 3


¿puedes, por favor, decirme qué debo poner en la consulta para que me muestre esto?

un saludo.
  #6 (permalink)  
Antiguo 16/05/2011, 07:06
Avatar de Heimish2000  
Fecha de Ingreso: enero-2011
Ubicación: Madrid
Mensajes: 844
Antigüedad: 13 años, 2 meses
Puntos: 89
Respuesta: Consulta con dos Count

El GROUP BY es por U.idUsuario, U.nombreUsuario

Código MySQL:
Ver original
  1.     U.idUsuario,
  2.     U.nombreUsuario,
  3.     COUNT(T.idTorneo) TorneosGanados,
  4.     COUNT(R.idReto) RetosRealizados
  5.     Usuarios U
  6.     LEFT JOIN Torneos T ON U.idUser = T.idUserGanador
  7.     LEFT JOIN Retos R ON U.idUser = R.idUserGanador;
  8. GROUP BY U.idUsuario, U.nombreUsuario
  #7 (permalink)  
Antiguo 16/05/2011, 07:22
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: Consulta con dos Count

Sorry, me olvidé de ponerlo...
__________________
¿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: count
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 03:48.