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

Ayuda consulta MAX

Estas en el tema de Ayuda consulta MAX en el foro de Mysql en Foros del Web. Hola a todos y siento empezar mi andadura en el foro con una consulta pero ahí va: La consulta me pide: "Para cada socio (nombre, ...
  #1 (permalink)  
Antiguo 25/01/2009, 10:57
 
Fecha de Ingreso: enero-2009
Mensajes: 3
Antigüedad: 15 años, 2 meses
Puntos: 0
Ayuda consulta MAX

Hola a todos y siento empezar mi andadura en el foro con una consulta pero ahí va:

La consulta me pide: "Para cada socio (nombre, telefono) indicar la nacionalidad (nacionalidad) más común entre las películas que ha alquilado, las haya devuelto o no. Es decir, si un socio suele alquilar más películas españolas que de cualquier otra nacionalidad, debe aparecer su nombre y teléfono junto con la nacionalidad ‘ESPAÑA’."

Yo consigo que me muestre la lista de nacionalidades alquiladas por cada socio pero no se como quedarme solo con la máxima de cada uno...

SELECT count(p.nacionalidad), p.nacionalidad, q.dni_socio
FROM alquiler q, pelicula p
WHERE q.titulo = p.titulo
GROUP BY q.dni_socio, p.nacionalidad
ORDER BY q.dni_socio, p.nacionalidad;

Gracias a todos por la ayuda
  #2 (permalink)  
Antiguo 25/01/2009, 16:00
 
Fecha de Ingreso: marzo-2004
Mensajes: 32
Antigüedad: 20 años
Puntos: 0
Respuesta: Ayuda consulta MAX

Si no me equivoco esa consulta te muestra todos las nacionalidades alquiladas por cada socio, y te dice las veces que cada nacionalidad ha sido alquilada por cada socio.

Y quieres obtener para cada nacionalidad alquilada el socio que más veces la ha alquilado.

SELECT p.nacionalidad, MAX(count(p.nacionalidad)), q.dni_socio
FROM alquiler q, pelicula p
WHERE q.titulo = p.titulo
GROUP BY p.nacionalidad

igual estoy diciendo alguna barbaridad, pero es lo que se me ha ocurrido, ya me dirás.
  #3 (permalink)  
Antiguo 24/04/2009, 09:46
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Respuesta: Ayuda consulta MAX

Hola, a mi tb me ha pasado lo mismo y estoy tb haciendo el mismo ejercicio y no se como sacar el maximo de cada uno, alguno me podria hechar una mano ???
  #4 (permalink)  
Antiguo 24/04/2009, 10:07
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Ayuda consulta MAX

Les comparto este post.
ahí se da solución a un problema similar.

http://www.forosdelweb.com/f86/probl...ct-max-689828/

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 24/04/2009, 10:17
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Respuesta: Ayuda consulta MAX

No entiendo lo que quereis decir en el enlace ¿Cual es la solucion buena en ese ejemplo? Serias tan amable de explicarmelo ? En mi caso tengo que hacer lo siguiente antes para sumar todas las veces de la pelicula alquilada asi:

SELECT S.nombre, S.telefono, P.nacionalidad, COUNT(*) AS veces_alquilada FROM SOCIO S, ALQUILER Q, PELICULA P WHERE Q.titulo=P.titulo AND S.dni=Q.dni_socio GROUP BY S.nombre, S.telefono, P.nacionalidad ORDER BY S.nombre

Ahora quiero que salgan las veces maximas alquiladas de cada persona

Última edición por freddieM; 24/04/2009 a las 11:09
  #6 (permalink)  
Antiguo 24/04/2009, 12:11
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Ayuda consulta MAX

Que pena por demorarme, no estaba en la oficina.

Para el caso de uds sería algo así:

Código mysql:
Ver original
  1. SELECT p.nacionalidad, q.dni_socio
  2. FROM alquiler q inner join pelicula p
  3. on q.titulo = p.titulo
  4. (select titulo tit, max(nacionalidad) maximo from pelicula group by titulo)t1
  5. on t1.tit = p.titulo and t1.maximo=p.nacionalidad
  6. ORDER BY q.dni_socio, p.nacionalidad;

Donde se hace la relación con la consulta de todos los maximos por titulo.
El secreto es anidar las tablas, con la consulta de máximas y establecer cuales se deben mostrar.

Les recomiendo hacer uso de sentencias join en cambio de la anidación de tablas separadas por coma (,).
En este post explica muy bien gnzsoloyo las razones.
http://www.forosdelweb.com/f86/inner-join-644840/

Un saludo, espero les sirva.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 24/04/2009, 12:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda consulta MAX

Echad también un vistazo a esta consulta de QUIMFV para conseguir un max(count).
http://www.forosdelweb.com/f86/como-...repita-579381/
Parece compleja y él dice que poco elegante, pero funciona. Sólo tendréis que adaptarla a vuestros datos.
  #8 (permalink)  
Antiguo 25/04/2009, 03:31
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Respuesta: Ayuda consulta MAX

No me sale la salida que tiene que salir, creo que no es asi, si quiere le mando las tablas de realaciones:

DIRECTOR (nombre, nacionalidad)
PELICULA (titulo, nacionalidad, productor, fecha, nombre_director)
Clave externa: nombre_director → DIRECTOR (Nombre)
ACTOR (nombre, nacionalidad, sexo)
PARTICIPA (titulo, nombre, tipo_papel)
Claves externas: titulo → PELICULA (titulo)
nombre → ACTOR(nombre)
COPIA (titulo, num_copia, estado)
Clave externa: titulo → PELICULA (titulo)
ALQUILER (titulo, num_copia, dni_socio, fecha, devolucion)
Claves externas: titulo, num_copia → COPIA (titulo, num_copia)
dni_socio → SOCIO (dni)
SOCIO (dni, nombre, direccion, telefono, avalista)
Clave externa: avalista → SOCIO (dni)
  #9 (permalink)  
Antiguo 25/04/2009, 06:04
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Ayuda consulta MAX

En tu estructura, no tienes un campo donde se cuente el numero de veces que alquila un socio. Como será posible determinar este valor entre tantos usuarios?

Sin embargo prueba esto:

Código mysql:
Ver original
  1. SELECT S.nombre, S.telefono, P.titulo,M.NP FROM SOCIO S INNER JOIN ALQUILER Q
  2. ON S.dni=Q.dni_socio INNER JOIN PELICULA P ON Q.titulo=P.titulo INNER JOIN
  3. (select dni_socio, count(*) NP FROM ALQUILER group by dni_socio)M
  4. ON M.dni_socio = S.dni

Según entiendo, deseas en pocas palabras, mostrar los clientes que mas alquilan. sería recomendable tener un campo en socios un contador de peliculas que alquila. sería mucho mas facil hacer este tipo de consultas.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 25/04/2009, 09:54
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Respuesta: Ayuda consulta MAX

El enunciado es el siguiente:

Para cada socio (nombre, telefono) indicar la nacionalidad (nacionalidad) más común entre las películas que ha alquilado, las haya devuelto o no. Es decir, si un socio suele alquilar más películas españolas que de cualquier otra nacionalidad, debe aparecer su nombre y teléfono junto con la nacionalidad ‘ESPAÑA’.
  #11 (permalink)  
Antiguo 25/04/2009, 10:06
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Ayuda consulta MAX

Si desean hacer una consulta así, añadan un campo en la tabla alquiler que contabilice las veces que una pelicula se alquila.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #12 (permalink)  
Antiguo 25/04/2009, 10:17
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Ayuda consulta MAX

Sobre los datos de falco82 y haciendo uso de la sintaxis de QUIMFV adaptada al caso (controla incluso los casos de empate en una lengua; maravillas de quimfv):
Código sql:
Ver original
  1. SELECT vp.socio socio, vp.total, vp.nacionalidad
  2. FROM
  3.  (SELECT v.dni_socio socio, MAX(v.tot) AS maximo
  4.   FROM (SELECT v1.dni_socio, COUNT( * ) AS tot, p.nacionalidad nacionalidad
  5. FROM alquiler v1
  6. INNER JOIN pelicula p ON p.titulo = v1.titulo
  7. GROUP BY v1.dni_socio, p.nacionalidad
  8. ORDER BY tot)v GROUP BY v.dni_socio)sv
  9. INNER JOIN
  10.  
  11. (SELECT v2.dni_socio socio ,COUNT(*) AS total, p.nacionalidad
  12.           FROM alquiler v2 INNER JOIN pelicula p ON p.titulo = v2.titulo
  13.           GROUP BY v2.dni_socio, p.nacionalidad)vp ON sv.maximo = vp.total AND sv.socio = vp.socio
  #13 (permalink)  
Antiguo 25/04/2009, 10:31
 
Fecha de Ingreso: abril-2009
Mensajes: 5
Antigüedad: 15 años
Puntos: 0
Respuesta: Ayuda consulta MAX

Efectivamente la solucion de Jurena es la correcta, muchas gracias
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 07:43.