Como sacar nombres y añadir una imagen

Iniciado por Brida, 16 Agosto 2013, 06:11 AM

0 Miembros y 1 Visitante están viendo este tema.

Brida

Os comento, tengo una base de datos con una tabla con nombre de alumnos y otra con fotos de esos alumnos. Las tablas son:

alumnos(ID, nombre, apellido);
fotos(ID, ID_alumno, nombre_foto, timestamp);

Lo que he hecho para sacar la información es:

SELECT al.nombre, al.apellidos FROM alumnos al LEFT JOIN fotos fo ON al.ID=fo.ID_alumno

La mayoría de veces me aparece todo perfecto, pero cuando un alumno tiene dos o más fotos el resultado aparece duplicado.

¿Qué solución se os ocurre aparte de usar un GROUP BY la.ID?
Por que creo que debe existir alguna forma mejor ¿no?

¡Gracias!

engel lex

supongo que quieres un solo resultado (realmente dices que sale duplicado pero no como quieres que salga, pero aqui dejo esto) puedes usar LIMIT, capypaste de dev.mysql.com

Citara cláusula LIMIT puede usarse para restringir el número de registros retornados por el comando SELECT. LIMIT tiene uno o dos argumentos numéricos, que deben ser enteros positivos (incluyendo cero).

Con dos argumentos, el primer argumento especifica el desplazamiento del primer registro a retornar. El desplazamiento del registro inicial es 0 (no 1):

mysql> SELECT * FROM table LIMIT 5,10;  # Retrieve rows 6-15
.
.
.
mysql> SELECT * FROM table LIMIT 5;     # Retrieve first 5 rows

puedes usar LIMIT 1 para obtener un solo registro
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

1mpuls0

Cita de: Brida en 16 Agosto 2013, 06:11 AM
La mayoría de veces me aparece todo perfecto, pero cuando un alumno tiene dos o más fotos el resultado aparece duplicado.

¿Qué solución se os ocurre aparte de usar un GROUP BY la.ID?
Por que creo que debe existir alguna forma mejor ¿no?

No regresa duplicados xD, coloca el campo fo.nombre_foto y verás, aunque no sé que quieres hacer.
Si necesitas todas las fotos del alumno tu consulta está bien.
Si necesitas la última foto capturada tendrías que hacer lo siguiente.

Código (sql) [Seleccionar]

SELECT * FROM alumnos al INNER JOIN
(SELECT ID_alumno, MAX(timestamp) FROM fotos GROUP BY ID_alumno) fo
ON al.ID=fo.ID_alumno


1. No se que tiene que ver tu consulta con php
2. No utilices palabras reservadas por el motor de base de datos (timestamp)

Saludos.
abc

Brida

Gracias.

Darhius lo que quiero es que salgo sólo una foto.

1mpuls0

#4
Pero cuál es esa "solo una" la más reciente, la más antigua?.

Por cierto que datos necesitas en la consulta?, porque en esa que te muestro hay algo "raro" :P y si me dices que campos exactamente requieres puedo ayudarte a arreglarla.
abc

Brida

Cita de: Darhius en 16 Agosto 2013, 16:26 PM
Pero cuál es esa "solo una" la más reciente, la más antigua?.

Por cierto que datos necesitas en la consulta?, porque en esa que te muestro hay algo "raro" :P y si me dices que campos exactamente requieres puedo ayudarte a arreglarla.

No importa cual, los alumnos salen igual de feos en todas.

basickdagger


1mpuls0

#7
Cita de: Brida en 16 Agosto 2013, 19:22 PM
No importa cual, los alumnos salen igual de feos en todas.

xDD

Puedes hacerlo utilizando group by
Código (sql) [Seleccionar]

SELECT al.ID AS ID_alumno, al.nombre, al.apellido, fo.ID as ID_foto, fo.nombre_foto FROM alumnos al
LEFT JOIN fotos fo on al.ID=fo.ID_alumno group by al.ID


También se puede con distinct deja ver de que forma...

con subconsultas...

Código (sql) [Seleccionar]

SELECT al.ID AS ID_alumno, al.nombre, al.apellido, fo.ID as ID_foto, fo.nombre_foto FROM alumnos al, fotos fo
where al.ID=fo.ID_alumno group by al.ID
abc

Brida

Vale mil gracias, pensaba que se debía de hacer sin el Group By, pero sin problemas :-P

Gracias!

1mpuls0

Entonces te sirve así?.

Por qué no lo quieres hacer con group by?
o solo buscas otra alternativa?.

Es que... olvidé una excepción de distinct con subquerys aunque estoy intentando de otra forma además de group by.
abc