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

Una de SQL (fácil)

Estas en el tema de Una de SQL (fácil) en el foro de Bases de Datos General en Foros del Web. Debe ser sencillo pero estoy atascado con este caso: Sean dos tablas: "Fotos" y "Comentarios" relacionadas a través del campo "IdFoto", (una foto puede tener ...
  #1 (permalink)  
Antiguo 05/12/2005, 15:19
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Una de SQL (fácil)

Debe ser sencillo pero estoy atascado con este caso:
Sean dos tablas: "Fotos" y "Comentarios" relacionadas a través del campo "IdFoto", (una foto puede tener varios comentarios):

CREATE TABLE `Fotos` (
`IdFoto` int(11) unsigned NOT NULL auto_increment,
`Ruta` varchar(100) NOT NULL default '',
`Title` varchar(50) NOT NULL default '',
`FechaFoto` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`IdFoto`)
) TYPE=MyISAM PACK_KEYS=1 AUTO_INCREMENT=50 ;

CREATE TABLE `Comentarios` (
`IdComentario` int(11) unsigned NOT NULL auto_increment,
`IdFoto` int(11) unsigned NOT NULL default '0',
`Autor` varchar(50) NOT NULL default '',
`FechaComentario` datetime NOT NULL default '0000-00-00 00:00:00',
`Texto` text NOT NULL,
PRIMARY KEY (`IdComentario`)
) TYPE=MyISAM AUTO_INCREMENT=20 ;

Necesito una SQL para mostrar los 5 últimos comentarios que sean pertenecientes a fotos diferentes.
Es decir si tengo en la tabla "Comentarios" los siguientes registros:

IdComentario IdFoto Autor Fecha
1.......................1......Rafa....2005-01-01
2.......................2......Rafa....2005-01-01
3.......................1......Pepe...2005-01-02
4.......................1......Juan....2005-01-03
5.......................3......Pepe....2005-01-03
6.......................4......Luis.....2005-01-03
7.......................3......Angel...2005-01-05
8.......................5......Maria...2005-01-07
9.......................6......Alex.....2005-01-09

Se muestre un recordset así:
IdComentario IdFoto Autor Fecha
9.......................6......Alex......2005-01-09
8.......................5......Maria....2005-01-07
7.......................3......Angel....2005-01-05
6.......................4......Luis......2005-01-03
4.......................1......Juan.....2005-01-03

Es decir, quiero mostrar los 5 comentarios más recientes y que sean de 5 fotos diferentes.

Un saludo y gracias de antemano.

Última edición por txus35; 06/12/2005 a las 00:14
  #2 (permalink)  
Antiguo 06/12/2005, 00:15
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Ahora tengo lo siguiente:

"SELECT Comentarios.*, Fotos.*
FROM Comentarios INNER JOIN Fotos
ON Comentarios.IdFoto = Fotos.IdFoto
ORDER BY Comentarios.Fecha DESC LIMIT 4"


Problema: si los 5 últimos comentarios son de la misma foto, los coge esos 5 y yo quiero que coja el más reciente de esos 5 y los 4 siguientes que sean de fotos diferentes.

Imagino que habrá que usar las clausulas GROUP BY, HAVING o quizás subconsultas pero no sé cómo.
  #3 (permalink)  
Antiguo 07/12/2005, 13:43
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
La última SQL que he probado es la siguiente:

'SELECT Comentarios.*, Fotos.*
FROM Comentarios INNER JOIN Fotos
ON Comentarios.IdFoto = Fotos.IdFoto
GROUP BY IdFoto, FechaComentario'


Sigue sin salir bien. Quiero que me devuelva 1 único registro por grupo y que sea el más reciente de todos los del grupo. Alguien sabe cómo?
  #4 (permalink)  
Antiguo 07/12/2005, 17:14
Avatar de claray  
Fecha de Ingreso: agosto-2004
Ubicación: ahora... en Caracas
Mensajes: 345
Antigüedad: 20 años, 3 meses
Puntos: 0
Se me ocurre algo asi:

SELECT * FROM COMENTARIOS C
WHERE idComentario=(SELECT idComentario FROM Comentarios c1
WHERE c1.idfoto=c.idfoto order by fechaComentario DESC
LIMIT 1)
order by idfoto,fechaComentario

pruebalo y avisas...

Saludos y suerte
__________________
:pirata: El arte de desarrollar es dejar que los otros lo hagan
  #5 (permalink)  
Antiguo 08/12/2005, 03:03
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Gracias claray por tu ayuda.
He adaptado tu idea sin éxito de esta forma:

"SELECT * FROM Fotos WHERE IdFoto=
(SELECT IdFoto FROM Comentarios
WHERE Comentarios.IdFoto=Fotos.IdFoto ORDER BY FechaComentario DESC LIMIT 1)
ORDER BY IdFoto,FechaFoto"


Insisto que la idea básica es que seleccionemos los 5 comentarios más recientes de la tabla Comentarios. Sólo que si por ejemplo, 3 de los últimos 5 comentarios pertenecen a la misma foto, aparezca sólo el más reciente de ellos 3 y el resto de las otras fotos.
  #6 (permalink)  
Antiguo 08/12/2005, 06:01
 
Fecha de Ingreso: diciembre-2003
Mensajes: 141
Antigüedad: 20 años, 11 meses
Puntos: 0
Buenas, txus35.

Has probado de realizar el select con DISTINCT?

Select DISTINCT IdFoto, Autor, IdComentario FROM Comentarios ORDER BY Fecha DESC LIMIT 4

De esta manera solo seleccionamos un IdFoto distinto cada vez.

Saludos!!!
  #7 (permalink)  
Antiguo 08/12/2005, 07:07
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Gracias Neoz, ya he probado el DISTINTC sin éxito, lo hice así:

"SELECT DISTINCT (Comentarios.IdFoto), Comentarios.FechaComentario, Comentarios.Autor, Comentarios.Texto,Fotos.*
FROM Comentarios INNER JOIN Fotos
ON Comentarios.IdFoto = Fotos.IdFoto
ORDER BY FechaComentario DESC LIMIT 5"


La sentencia muestra bien los 5 últimos comentarios realizados pero no agrupa por IdFoto. En fin, quizás ésto no sea tan sencillo como parece. ¿Alguna idea?
  #8 (permalink)  
Antiguo 08/12/2005, 07:14
Avatar de claray  
Fecha de Ingreso: agosto-2004
Ubicación: ahora... en Caracas
Mensajes: 345
Antigüedad: 20 años, 3 meses
Puntos: 0
Hola otra vez,

Me extraña que no te funcione....

Lo probe (cree las tablas y llene con los datos que proporcionas) y, esta consulta me devuelve la información "exactamente" a como tu la quieres...


Claro, no tiene limite de numero de registros a devolver, por eso le he agregado el LIMIT 5 final...


SELECT * FROM COMENTARIOS C
WHERE idComentario=(SELECT idComentario FROM Comentarios c1
WHERE c1.idfoto=c.idfoto order by fechaComentario DESC
LIMIT 1)
order by idfoto,fechaComentario LIMIT 5


Esta consulta toma, para cada ID de foto, la consulta mas reciente, por lo que solo recibirias - como maximo - un comentario por idfoto, ahora lo ordenas por la fecha del comentario y tienes las "n" mas recientes... No entiendo por que no te sirve....


saludos y suerte
__________________
:pirata: El arte de desarrollar es dejar que los otros lo hagan
  #9 (permalink)  
Antiguo 08/12/2005, 11:40
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Gracias Claray por tu ayuda.
Tu SQL no me devuelve recordset. Le he dado mil vueltas adaptándolo a las tablas descritas en mi primer comentario y no hay manera. Además, debo tomar valores de ambas tablas "Fotos" y "Comentarios" y tu consulta no cita la tabla "Fotos".

Lo último que he probado, sin éxito, ha sido:
"SELECT * FROM Comentarios
WHERE IdComentario=(SELECT IdComentario FROM Fotos
WHERE Fotos.IdFoto=Comentarios.IdFoto DESC LIMIT 1)
GROUP BY IdFoto, FechaComentario DESC LIMIT 5"
  #10 (permalink)  
Antiguo 08/12/2005, 11:52
Avatar de claray  
Fecha de Ingreso: agosto-2004
Ubicación: ahora... en Caracas
Mensajes: 345
Antigüedad: 20 años, 3 meses
Puntos: 0
Lo de incluir datos de fotos no es problema, solo es necesario incluir el "join"

por ejemplo:

SELECT * FROM Comentarios
INNER JOIN Fotos ON Comentarios.IdFoto = Fotos.IdFoto
WHERE IdComentario=(SELECT IdComentario FROM Fotos
WHERE Fotos.IdFoto=Comentarios.IdFoto DESC LIMIT 1)
GROUP BY IdFoto, FechaComentario DESC LIMIT 5

El que no te devuelva datos si es preocupante...
Asumo, por lo que dices que esta ejetunado desde una aplicacion y el resultado es asignado a un recordset... otra consulta si devuelve valores? (sustituyela por "select * from comentarios" para probar que esta devolviendo valores).

Primero prueba la consulta en un "query analizer" de manera que te asegures que la consulta esta devolviendo los rsultados apriopiados y luego incluye la consulta en tu programa.

Saludos.
__________________
:pirata: El arte de desarrollar es dejar que los otros lo hagan
  #11 (permalink)  
Antiguo 08/12/2005, 12:08
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Hola Claray,

"SELECT * FROM Comentarios" devuelve valores correctamente.

Pienso que tu SQL del mensaje anterior es impecable pero el motor de MySQL me da este error de sintaxis:

MySQL ha dicho:
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near:
...WHERE IdComentario=(SELECT IdComentario FROM Fotos'...

Parece que MySQL no acepta expresiones SQL montadas como:
...WHERE IdComentario=(SELECT IdComentario FROM Fotos...
¿Se puede cambiar esta sintaxis? ¿Cómo?

La consulta que he probado sin éxito ha sido:
"SELECT Comentarios.*, Fotos.* FROM Comentarios
INNER JOIN Fotos ON Comentarios.IdFoto = Fotos.IdFoto
WHERE IdComentario=(SELECT IdComentario FROM Fotos
WHERE Fotos.IdFoto=Comentarios.IdFoto DESC LIMIT 1)
GROUP BY IdFoto, Fecha DESC LIMIT 5"

Última edición por txus35; 08/12/2005 a las 13:07
  #12 (permalink)  
Antiguo 09/12/2005, 11:33
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Parece que ni MySQL ni ACCESS aceptan expresiones SQL montadas como:
...WHERE IdComentario=(SELECT IdComentario FROM Fotos...

Estoy atascadisimo con esta SQL...se os ocurre alguna idea ??

Última edición por txus35; 12/12/2005 a las 00:12
  #13 (permalink)  
Antiguo 12/12/2005, 00:13
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Alguna idea ?
  #14 (permalink)  
Antiguo 12/12/2005, 12:19
Avatar de JoseGCB  
Fecha de Ingreso: noviembre-2004
Ubicación: Caracas Venezuela
Mensajes: 91
Antigüedad: 20 años
Puntos: 0
Cita:
Iniciado por txus35
Parece que ni MySQL ni ACCESS aceptan expresiones SQL montadas como:
...WHERE IdComentario=(SELECT IdComentario FROM Fotos...

Estoy atascadisimo con esta SQL...se os ocurre alguna idea ??

y si pruebas

Cita:
...WHERE IdComentario IN (SELECT IdComentario FROM Fotos...
__________________
:-D El peor error es no hacer nada
por pensar que es poco lo que se puede hacer..!!!
  #15 (permalink)  
Antiguo 13/12/2005, 00:21
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Gracias JoseGCB:
He probado sin éxito tu propuesta:
"SELECT Comentarios.*, Fotos.*
FROM Comentarios INNER JOIN Fotos ON Comentarios.IdFoto = Fotos.IdFoto
WHERE IdComentario IN (SELECT IdComentario FROM Fotos
WHERE Fotos.IdFoto=Comentarios.IdFoto DESC LIMIT 1)
GROUP BY IdFoto, FechaComentario DESC LIMIT 5"


Trabajo con MySQL y PHP y sale este error: "Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource". Consultas sencillas funcionan pero ésta no.

No entiendo qué pasa. Parece una SQL sencilla pero se me está atravesando. Si alguien tiene alguna idea será muy bienvenida. Un saludo y gracias a todos.
  #16 (permalink)  
Antiguo 15/12/2005, 00:16
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
SOS, alguna idea ?
  #17 (permalink)  
Antiguo 16/12/2005, 00:27
Avatar de txus35  
Fecha de Ingreso: mayo-2005
Mensajes: 42
Antigüedad: 19 años, 6 meses
Puntos: 0
Socorrooooo !!!!
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 14:37.