Ver Mensaje Individual
  #4 (permalink)  
Antiguo 28/03/2016, 05:33
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con registros repetidos

Cita:
Gracias, me queda claro cuando te refieres a repetición, era un concepto que no conocía y claramente lo confundía…. Ahora sobre el tecnicismo refiriéndose a lo demás, dup, cardinalidad 1:N y etc no tengo ni la menor idea sobre ello, solo llevo 5 meses aprendiendo sobre este mundo de forma autodidacta, por ello no puedo aun expresar bien las palabras apropiadas y lógicamente hago lo que puedo…
Se denomina "cardinalidad" en las relaciones de entidades del modelo E-R al numero de instancias de una entidad que se relaciona en forma unívoca con las de otra entidad. En BBDD se expresa cuando describes la relación, como por ejemplo:
1) Una única galería puede relacionarse con una o más fotografías.
2) Cada imagen sólo se relaciona con una única galería.
Estas dos definiciones nos indican que existe una relación 1:N entre Galería e Imagen, ya que por cada Galería puede haber N imágenes, y a la inversa sólo puede haber una galería relacionada con una imagen cualquiera.

¿Se entiende?

Este concepto es determinante porque nos indica que obligatoriamente la tabla Imágenes, que es la representación de la entidad "Imagen" tiene que llevar una columna que es FK de la tabla Galería (una entidad no es lo mismo que una tabla, una es parte del modelo lógico, y la tabla es una construcción física).

¿Se va entendiendo?

En tu caso ejemplificado hay una condición que estoy poniendo, y que luego es también determinante a la hora de consultar:

"Una única galería puede relacionarse con una o más fotografías."

El "puede" significa que la relación no es exactamente "1", sino que pueden no haber imágenes asociadas a una galería, es decir, la galería podría estar vacía... y eso modlifica la consulta. Implicaría que en lugar de ser INNER JOIN, la cláusula es LEFT JOIN.

Por otro lado, si lo que quieres es obtener todas las galerías con sus fotos, es posible en una única consulta. Para eso se usa una cláusula IN() de la siguiente forma:

Código SQL:
Ver original
  1. SELECT
  2.    DISTINCTROW IDGALERIA,
  3.    TITULO,
  4.    DESCRIPCION,
  5.    CATEGORIA_ID,
  6.    DATE_FORMAT( FECHA_ALTA, '%d/%m/%Y' ) FECHA,
  7.    IMAGEN
  8. FROM galerias G  
  9.     INNER JOIN fotos f ON G.galeria_id= f.galeria_id
  10.     INNER JOIN categoria C ON G.FKCATEGORIA = C.CATEGORIA_ID
  11. WHERE CATEGORIA_ID IN(1, 2, 3, 5,12).

El listado de las categorias, separado por comas, es algo que debes construir programáticamente.

Ahora bien, noto que tampoco estás respetando la sintaxis de un INNER JOIN, dado que no incluyes la clausula ON, ni especificas la relación.
Los DBMS no funcionan por telepatía. No pueden saber cuáles son los campos que relacionan las tablas, porque para ello no leen la definicion de las tablas, por lo que no acceden a las FK. La meta de las FK es mantener la integridad referencial, cosa que sólo está vinculada con las sentencias INSERT, UPDATE y DELETE, y NO con SELECT.
Por consecuencia, debes especificar la relación en el FROM, o de lo contrario podrían generarse respuestas incorrectas:
Código SQL:
Ver original
  1. SELECT
  2.    DISTINCTROW IDGALERIA,
  3.    TITULO,
  4.    DESCRIPCION,
  5.    CATEGORIA_ID,
  6.    DATE_FORMAT( FECHA_ALTA, '%d/%m/%Y' ) FECHA,
  7.    IMAGEN
  8. FROM galerias G  
  9.     INNER JOIN fotos f ON G.galeria_id= f.galeria_id
  10.     INNER JOIN categoria C ON G.FKCATEGORIA = C.CATEGORIA_ID
  11. WHERE CATEGORIA_ID IN(1, 2, 3, 5,12).

En cuanto a cómo lo vayas a mostrar en la pantalla, eso es tema de programación y eso es OFF TOPIC en los foros de BBDD. Sólo te puedo decir que simplemente tomas el nombre de la galería para mostrarlo en cada pagina, como lo deseas, y dentro de esa pagina tomas el resto de los datos para generar la lista.
En el foro de PHP ya respondí varias veces como se hace ese tipo de listados. Busca esa info por allí.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)