MySQL - Dado un cliente obtener la atracción más visitada

 
Vista:

Dado un cliente obtener la atracción más visitada

Publicado por Guido Tripodi (3 intervenciones) el 08/05/2018 14:42:13
Hola cómo están?

Les comento estoy haciendo una query que necesito obtener la atracción más visitada por cliente.

Tengo las siguientes tablas: cliente, producto, consumo y tarjeta

Lo que hago es lo siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT cliente.nombre, cliente.apellido, producto.nombre, count(*) as cantidadVisitado
FROM mydb.Cliente cliente, mydb.Tarjeta tarjeta, mydb.Producto producto, mydb.Consumo consumo
WHERE consumo.idTarjeta = tarjeta.idTarjeta
  AND tarjeta.idCliente = cliente.idCliente
  AND producto.idProducto = consumo.idProducto
GROUP BY consumo.idTarjeta, consumo.idProducto
HAVING count(*) >= ALL (SELECT count(*) as count FROM
mydb.Cliente cliente, mydb.Tarjeta tarjeta, mydb.Producto producto, mydb.Consumo consumo
WHERE consumo.idTarjeta = tarjeta.idTarjeta
  AND tarjeta.idCliente = cliente.idCliente
  AND producto.idProducto = consumo.idProducto
GROUP BY consumo.idTarjeta, consumo.idProducto)
;

En ves de devolverme una tupla por cada cliente atracción cantidad visitada máxima


Me devuelve una única tupla con el cliente y la atracción que más visito que es máxima entre todas las tuplas cliente atracción cantidad visitada

Cómo debería hacer?

Muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Dado un cliente obtener la atracción más visitada

Publicado por leonardo_josue (414 intervenciones) el 08/05/2018 23:17:29
Hola Guido:

No nos das mucha información acerca de tu modelo de tabas ni acerca de la información que guardas en cada una de ellas y así resulta muy complicado tratar de ayudarte.

Sin embargo te puedo decir que hay muchas formas de resolver tu problema, algunas más simples que otras, dependiendo justamente de cómo tengas organizada tu información pero básicamente el problema se resuelve en pasos:

1. Tienes qué CONTAR cuantas veces a visitado cada atracción el o los clientes que te interesen... Esto lo logras con la función de agrupación y con la cláusula GROUP BY...

2. sobres la primer consulta OBTIENES EL PRIMER REGISTRO o EL REGISTRO MAS ALTO para cada cliente... esto también lo puedes hacer de muchas formas, por ejemplo con LIMIT 1 ordenando de manera descendente o con MAX sobre la consulta COUNT anterior...

3. Utilizas este dato para filtrar tu consulta primer consulta... esto lo puedes hacer con un WHERE o con un JOIN o con una subconsulta... hay muchas formas de resolverlo insisto, dependerá de cómo tengas tu información.

Si continuas con problemas, postea por separado la estructura de tus tablas, pon algunos datos de ejemplo y dinos qué es lo que intentaste hacer y con gusto te ayudamos a corregir y/o completar lo que haga falta.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dado un cliente obtener la atracción más visitada

Publicado por Guido Tripodi (3 intervenciones) el 09/05/2018 01:11:12
Muchas gracias por la respuesta!

La tabla cliente cuenta con nombre apellido e idcliente, la tabla productos tiene nombre idproducto, la tabla consumo tiene idproducto idconsumo, idtarjeta y valorconsumo y por ultimo la tabla tarjeta tiene idtarjeta idcliente. Cuando hago la cuenta de la cantidad de veces que el cliente vio cierto producto obtengo las tuplas nombreCliente producto cantidadVisitado, pero cuando ordeno me pasa lo mismo de siempre, me devuelve solo el cliente con visita máxima, cuando yo necesito ver para cada cliente cual fue su máxima visita en verdad para luego poder hacer la subconsulta.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    cliente.nombre,
    cliente.apellido,
    producto.nombre,
    COUNT(consumo.idTarjeta) AS cantidadVisitado
FROM
    mydb.Cliente cliente,
    mydb.Tarjeta tarjeta,
    mydb.Producto producto,
    mydb.Consumo consumo
WHERE
    consumo.idTarjeta = tarjeta.idTarjeta
        AND tarjeta.idCliente = cliente.idCliente
        AND producto.idProducto = consumo.idProducto
GROUP BY cliente.nombre , cliente.apellido , producto.nombre
ORDER BY cantidadVisitado desc limit 1

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Dado un cliente obtener la atracción más visitada

Publicado por Guido Tripodi (3 intervenciones) el 09/05/2018 01:48:58
Estoy usando mysql
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Dado un cliente obtener la atracción más visitada

Publicado por leonardo_josue (414 intervenciones) el 09/05/2018 17:56:37
Hola de nuevo:

Aunque en mi post te pedía algunos datos de ejemplo, no los pusiste, así es que voy a tratar de jugar a adivino para ver si puedo ayudarte:

Supongo que tu consulta (sin el limit 1) te regresa algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-------------+------------+-----------+----------------+
|nombre       |apellido    |producto   |cantidadVisitado|
+-------------+------------+-----------+----------------+
|cliente uno  |apellido uno| producto 1|              10|
+-------------+------------+-----------+----------------+
|cliente uno  |apellido uno| producto 2|               8|
+-------------+------------+-----------+----------------+
|cliente uno  |apellido uno| producto 3|               5|
+-------------+------------+-----------+----------------+
|cliente dos  |apellido dos| producto 2|               1|
+-------------+------------+-----------+----------------+
|cliente dos  |apellido dos| producto 3|              14|
+-------------+------------+-----------+----------------+
|cliente dos  |apellido dos| producto 4|              11|
+-------------+------------+-----------+----------------+

Entonces, para este ejemplo te interesa obtener para el CLIENTE UNO, el producto 1 (qué es el que más visitas tiene) y para el CLEINTE DOS el producto 3, que es el que más visitó.

Entonces, como te dije, tienes MUCHAS opciones para obtener esto.

1. Podrías SIMULAR la función de agrupación ROW_NUMBER para numerar tus registros ordenados de mayor a menor, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+-------------+------------+-----------+----------------+-------+
|nombre       |apellido    |producto   |cantidadVisitado|row_num+
+-------------+------------+-----------+----------------+-------+
|cliente uno  |apellido uno| producto 1|              10|      1|
+-------------+------------+-----------+----------------+-------+
|cliente uno  |apellido uno| producto 2|               8|      2|
+-------------+------------+-----------+----------------+-------+
|cliente uno  |apellido uno| producto 3|               5|      3|
+-------------+------------+-----------+----------------+-------+
|cliente dos  |apellido dos| producto 3|              14|      1|
+-------------+------------+-----------+----------------+-------+
|cliente dos  |apellido dos| producto 4|              11|      2|
+-------------+------------+-----------+----------------+-------+
|cliente dos  |apellido dos| producto 2|               1|      3|
+-------------+------------+-----------+----------------+-------+

de tal suerte que si filtas los que tengan ROW_NUMBER = 1 obtienes el resultado esperado, en esta liga puedes encontrar algunas ideas de cómo simular la función ROW_NUM en MySQL:

http://www.artfulsoftware.com/infotree/qrytip.php?id=1098

2. Puedes hacer una subconsulta con MAX para obtener la atracción más visitada por cada cliente, es decir, hacer algo así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT T.cliente, T.apellido, MAX(cantidadVisitado) max_cantidad
FROM
( SELECT
    cliente.nombre,
    cliente.apellido,
    producto.nombre,
    COUNT(consumo.idTarjeta) AS cantidadVisitado
 FROM
    mydb.Cliente cliente,
    mydb.Tarjeta tarjeta,
    mydb.Producto producto,
    mydb.Consumo consumo
 WHERE
    consumo.idTarjeta = tarjeta.idTarjeta
        AND tarjeta.idCliente = cliente.idCliente
        AND producto.idProducto = consumo.idProducto
 GROUP BY cliente.nombre , cliente.apellido , producto.nombre) T;

Esto te regresaría algo como esto:

1
2
3
4
5
6
7
+-------------+------------+------------+
|nombre       |apellido    |max_cantidad|
+-------------+------------+------------+
|cliente uno  |apellido uno|          10|
+-------------+------------+------------+
|cliente dos  |apellido dos|          14|
+-------------+------------+------------+

entonces, podrías utilizar esto para FILTRAR tu consulta y mostrar sólo registros que coincidan con esto, la manera más fácil de hacerlo es agregando otro JOIN.

y podría continuar con más ejemplos de cómo obtener la consulta, pero me gustaría que intentaras o investigaras un poco más en SAN GOOGLE:

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar