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

Sentencia SQL dificil ayuda.

Estas en el tema de Sentencia SQL dificil ayuda. en el foro de Mysql en Foros del Web. Estas son las dos tablas de la base de datos Lector (NºTarjeta, Nombre, Apellidos, Telefono, Direccion) Prestamo (ISBN, IdSucursal, NºTarjeta, FechaInicio, FechaDevolucion) Y me piden ...
  #1 (permalink)  
Antiguo 15/05/2008, 14:48
 
Fecha de Ingreso: diciembre-2005
Mensajes: 46
Antigüedad: 18 años, 4 meses
Puntos: 0
Exclamación Sentencia SQL dificil ayuda.

Estas son las dos tablas de la base de datos

Lector (NºTarjeta, Nombre, Apellidos, Telefono, Direccion)

Prestamo (ISBN, IdSucursal, NºTarjeta, FechaInicio, FechaDevolucion)

Y me piden que mediante una sola query o sentencia sql tengo que obtener en una unica tupla Buscar el Nº de Tarjeta del lector que más préstamos ha solicitado indicando además el título del libro, sucursal y fechas de inicio y devolución de cada préstamo de dicho lector

Alguien se le ocurre algo?

Última edición por elmenda; 15/05/2008 a las 14:59
  #2 (permalink)  
Antiguo 15/05/2008, 14:58
 
Fecha de Ingreso: diciembre-2005
Mensajes: 46
Antigüedad: 18 años, 4 meses
Puntos: 0
Re: Sentencia SQL dificil ayuda.

se me ocurre algo por el estilo pero no me funciona

select count(p.NºTarjeta),p.IdSucursal, p.NºTarjeta, p.FechaInicio, p.FechaDevolucion from prestamo p,lector l where ((p.NºTarjeta = l.lector)
and
(count(p.NºTarjeta) > (SELECT COUNT(NºTarjeta) FROM prestamo GROUP BY NºTarjeta
))

Última edición por elmenda; 15/05/2008 a las 15:08
  #3 (permalink)  
Antiguo 15/08/2008, 10:01
Avatar de lop7  
Fecha de Ingreso: junio-2005
Ubicación: portuguesa (Venezuela)
Mensajes: 187
Antigüedad: 18 años, 11 meses
Puntos: 1
Respuesta: Sentencia SQL dificil ayuda.

create table #Lector1 (NºTarjeta int, Nombre char(10), Apellidos char(10), Telefono char(10), Direccion char(10))
create table #Prestamo1 (ISBN int, IdSucursal int, NºTarjeta int, FechaInicio smalldatetime, FechaDevolucion smalldatetime)

---tabla Lector
insert into #Lector1 values(1, 'jose','b','c', 'd')
insert into #Lector1 values(2, 'luis','b','c', 'd')
insert into #Lector1 values(3, 'maria','b','c', 'd')
---tabla prestamo
insert into #Prestamo1 values(1,1,1,'01/01/2008', '01/05/2008' )
insert into #Prestamo1 values(1,1,1,'01/01/2008', '01/05/2008' )
insert into #Prestamo1 values(1,1,1,'01/01/2008', '01/05/2008' )
insert into #Prestamo1 values(1,4,4,'01/01/2008', '01/05/2008' )
insert into #Prestamo1 values(1,2,2,'01/01/2008', '01/05/2008' )
insert into #Prestamo1 values(1,3,3,'01/01/2008', '01/05/2008' )
insert into #Prestamo1 values(1,3,3,'01/01/2008', '01/05/2008' )
insert into #Prestamo1 values(1,3,3,'01/09/2008', '01/05/2008' )
insert into #Prestamo1 values(1,3,3,'01/09/2008', '01/05/2008' )

--tu dices...
/* me piden que mediante una sola query o sentencia sql tengo que
obtener en una unica tupla Buscar el Nº de Tarjeta del lector que más préstamos ha solicitado indicando además
el título del libro, sucursal y fechas de inicio y devolución de cada préstamo de dicho lector
*/

Código PHP:
select top 1     ll.NºTarjeta,Nombre,IdSucursal,FechaInicio,FechaDevolucion
from   
#Prestamo1 pp,#Lector1 ll
where pp.NºTarjeta=ll.NºTarjeta 
    
and ll.NºTarjeta=(select top 1     l.NºTarjeta
                from  
#Prestamo1 p,#Lector1 l
                
where p.NºTarjeta=l.NºTarjeta 
                group by l
.NºTarjeta
                order by l
.NºTarjeta desc
--en este ejemplo muestra lo que creo que necesitas.
-- Nota: esto lo probe en SQL..
--drop table #Prestamo1
--drop table #Lector1
se que esto fue hace mucho pero apenas lo lei me interese...
Saludos...
__________________
A quien dices un secreto le entregas tu libertad :si:
  #4 (permalink)  
Antiguo 19/08/2008, 12:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: Sentencia SQL dificil ayuda.

Yo te hago una propuesta MySQL algo más compleja, quizás, porque tiene en cuenta la posibilidad de que dos personas hayan tomado prestados el mismo número de libros, y en ese caso te muestra los dos:

Cita:
SELECT l.nombre, l.apellidos, l.numtarjeta, p.ISBN, p.Idsucursal, p.fechainicio, p.fechadevolucion
FROM lector l
INNER JOIN prestamo p ON p.numtarjeta = l.numtarjeta
WHERE l.numtarjeta
IN (
SELECT l.numtarjeta
FROM lector l
INNER JOIN prestamo p ON l.numtarjeta = p.numtarjeta para el caso de que haya más de un numtarjeta
GROUP BY p.numtarjeta
HAVING count( p.numtarjeta ) = (
SELECT count( * ) AS prestamos
FROM prestamo p2
GROUP BY p2.numtarjeta
ORDER BY prestamos DESC
LIMIT 1 )
)
ORDER BY l.numtarjeta
Te explicaré algo la sintaxis, y lo haré por partes, en el orden en que lo estructuré:
1) en primer lugar, saco el número máximo de libros prestado a una persona
SELECT count( * ) AS prestamos
FROM prestamo p2
GROUP BY p2.numtarjeta
ORDER BY prestamos DESC
LIMIT 1

2) luego, busco todos los números de tarjeta cuyo total de préstamos sea ese:
SELECT l.numtarjeta
FROM lector l
INNER JOIN prestamo p ON l.numtarjeta = p.numtarjeta
GROUP BY p.numtarjeta
HAVING count( p.numtarjeta ) = (
SELECT count( * ) AS prestamos
FROM prestamo p2
GROUP BY p2.numtarjeta
ORDER BY prestamos DESC
LIMIT 1 )
)

3) Posteriormente, me traigo todos los datos de las personas cuyo número de tarifa está entre esos:
SELECT l.nombre, l.apellidos, l.numtarjeta, p.ISBN, p.Idsucursal, p.fechainicio, p.fechadevolucion
FROM lector l
INNER JOIN prestamo p ON p.numtarjeta = l.numtarjeta
WHERE l.numtarjeta
IN

4) y, finalmente, ordeno todo eso por numtarjeta
ORDER BY l.numtarjeta

Si usas una versión reciente de MySQL no creo que tengas problema con la subconsulta. Pruébalo y dínoslo.

Seguro que hay otras posibilidades. Recuerdo que Quimfv resolvió un problema como este de MAX(count) seguramente con una sintaxis más eficiente. Está aquí: http://www.forosdelweb.com/f86/como-...repita-579381/

Última edición por jurena; 21/08/2008 a las 02:38
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 10:17.