Consulta MySQL
Hola.
A ver si alguien me puede echar una mano con una consulta mysql.
Tengo dos tablas, 'coches' y 'fotos'. La segunda almacena el nombre de las fotos asociadas a los coches habiendo un número arbitrario de fotos por coche. Tienen los siguientes campos:
TABLA COCHES
- id
- modelo
TABLA FOTOS
- id
- coche_id
- nombre
La consulta debe extraer un listado de los coches pero para cada registro quiero mostrar también una foto, pero no cualquiera, sino la primera (la de menor id). Al hacer una consulta como esta:
SELECT * FROM coches LEFT JOIN fotos ON coches.id=fotos.coche_id GROUP BY coches.id ORDER BY fotos.id;
Me devuelve correctamente el listado de coches sin repetir ninguno, pero la foto asociada a cada coche no es la primera sino la que al servidor le da la gana.
Se le ocurre a alguien como hacer esto?
Gracias!!
[/list]
markshock
para hacer bien eso.. tendrias que tener 3 tablas... no 2.
TABLA COCHES
- coche_id
- modelo
TABLA FOTOS
- foto_id
- nombre
TABLA RELACION_COCHES_FOTOS
- coche_id
- foto_id
De esta manera, tendrías una base de datos relacional correctamente ordenadita y re-usable... y totalmente accesible usando tan solo 1 consulta SQL.
pruebalo, veras como te gusta y lo acabas usando para todas tus bases de datos ;)
tablas relacionales power!!
Isma
Que tal un poco de índices por aqui y otro poquito por hayá...?
Lo de la 3ª tabla esa, según opiniones, a mi me sobra...
mik
Estoy con Isma. Si la relación coches->fotos es de uno->varios (y no de varios->varios) la tercera tabla no es necesaria. De todas formas Mark, con las tres tablas, tampoco veo como tendría que ser la consulta para hacer lo que yo quiero...tenías algo en mente?
Índices Isma? A qué te refieres?
Gracias!!
Kr0n
No, relacionalmente está bien. No necesitas una tercera tabla, aunque podrías meterla simplemente para esto, pero sería una "chapuza". No es un conocimiento nuevo que el modelo ER tenga que reflejar, ya que existe en el modelo actual, sólo que "cuesta" sacarlo ;)
Has probado algo como esto?
SELECT min(fotos.id) , coches.* , fotos.*
FROM fotos
LEFT JOIN coches ON coches.id = fotos.coche_id
GROUP BY fotos.coche_id
angelphp
Si quieres la primera, la de menor id
SELECT * FROM coches LEFT JOIN fotos ON coches.id=fotos.coche_id GROUP BY coches.id ORDER BY fotos.id ASC;
Si quieres la ultima cambias ASC por DESC
mik
Gracias tíos, pero ninguna de las consultas me da el resultado que quiero.
La de angelphp es igual que la que estaba probando yo ya que por defecto la ordenación es ASC.
La de KrOn tampoco: en min(fotos.id) sí que devuelve el identificador mínimo pero lo que yo quiero es el nombre de la foto y el que devuelve es el mismo de antes. Parece que el GROUP BY de las filas de la tbla fotos se hace previo a cualquier ordenación que le pongas y te devuelve la fila que a él le da la gana (supongo que según el orden que lleve el servidor a nivel interno).
En fin...creo que tendré que renunciar a hacer con una sola consulta porque ya no se me ocurre nada más!!
Kr0n
Mmm, tienes razón. La comprobé con unas tablas similares que tengo, pero no, no da bien.
Y una sola consulta pero dos selects? :P
<code>
SELECT *
FROM coches c, fotos f
WHERE c.id = f.coche_id
AND f.id = ( SELECT min( id )
FROM fotos
WHERE coche_id = c.id )
</code>
Esta si que me funciona en mis tablas, a ver si hay suerte con las tuyas ;)
markshock
bueno.. con el modelo de 3 tablas, solamente deja abierta la opción a hacer la referencia VARIOS - VARIOS para un futuro.. ni mas ni menos. tampoco creo que sea una chapuza..
Igualmente, lo que has hecho de 2 tablas, me parece correcto, no habia pensado solamente en una relación UNO - VARIOS, practicamente siempre tengo que usar relaciones VARIOS-VARIOS... la costumbre...
La opcion de 2 selects como dice kr0n es lo mas correcto para solucionar tu caso. Si no te funciona usando 2 selects anidados, no se me ocurre nada.
Kr0n
Hombre, depende. Lo de chapuza me refería a crear una entidad simplemente para facilitar la consulta sql que quiere.
No todo es varios-varios, en este caso estarías diciendo por ej. que una foto puede estar asociada a muchos coches distintos, que no creo que sea el caso.
En general no estoy muy a favor de eso de "ponla varios-varios, si total, si no se usa ahora, se usará en el futuro". Cada relación tiene que tener una cardinalidad apropiada, sino estás complicando el modelo innecesariamente simplemente con la excusa de no pillarte los dedos, lo cual no es justificable. También podríamos decir que es un poco "chapucilla" eso (que no digo que sea lo que tu haces ojo, hablo en general) ;)
De todas formas, estas cosas se acaban cayendo por su propio peso, y si tienes esa estrategia de "toda cardinalidad varios-varios" en cuanto tu modelo sea de un tamaño mediano, ya verás la que se te monta :D
markshock
lo tendré en cuenta ;)
es que normalmente todo lo que son galerias de imagenes, ufff.. como pueden ser tan versatiles... que de la misma galería uses fotos a modo de repositorio para las noticias de la misma web.. para newsletter .. vamos.. para lo que sea..
para esas cosas suelo usar el VARIOS - VARIOS ... manteniendo un orden claro está. Otras cosas no.. pero galerias de imagenes... brr... :P
En este caso es algo muy especifico.. imagen - coche. ta correcto ;)
mik
Eso es!! subconsultas!!
Gracias!