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

Un Consejito porfavor

Estas en el tema de Un Consejito porfavor en el foro de Mysql en Foros del Web. Hola Miren, tengo estas tablas: Código: CREATE TABLE GENERO( ID_GENERO INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL, NOMBRE_GENERO CHAR(25) NOT NULL ); Y esta: Código: ...
  #1 (permalink)  
Antiguo 16/01/2010, 20:58
 
Fecha de Ingreso: enero-2010
Mensajes: 88
Antigüedad: 14 años, 3 meses
Puntos: 2
Un Consejito porfavor

Hola

Miren, tengo estas tablas:

Código:
CREATE TABLE GENERO(
 ID_GENERO INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
 NOMBRE_GENERO CHAR(25) NOT NULL
);
Y esta:

Código:
CREATE TABLE FICHA(
 ID_FICHA INT UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
 ID_TITULO INT NOT NULL, # FOREIGN KEY TITULO.ID_TITULO
 ID_DESARROLADOR INT NOT NULL, # FOREIGN KEY DESARROLLADOR.ID_DESARROLLADOR
 ID_GENERO INT NOT NULL, # FOREIGN KEY GENERO.ID_GENERO
 ID_GENERO_DOS INT DEFAULT NULL, # FOREIGN KEY GENERO.ID_GENERO
 ID_GENERO_TRES INT DEFAULT NULL, # FOREIGN KEY GENERO.ID_GENERO
 DIA_LANZAMIENTO INT DEFAULT NULL,
 MES_LANZAMIENTO INT DEFAULT NULL,
 ANO_LANZAMIENTO INT DEFAULT NULL,
 NUMERO INT DEFAULT NULL,
 PLATAFORMA INT DEFAULT NULL,
 IMAGEN_FICHA CHAR(255) NOT NULL, #100px Ancho, 120px Alto
 EDAD_RECOMENDADA CHAR(30) DEFAULT NULL,
 OTROS_NOMBRES CHAR(40) DEFAULT NULL
);

ALTER TABLE FICHA ADD FOREIGN KEY(ID_TITULO) REFERENCES TITULO(ID_TITULO);
ALTER TABLE FICHA ADD FOREIGN KEY(ID_DESARROLADOR) REFERENCES DESARROLLADOR(ID_DESARROLLADOR);
ALTER TABLE FICHA ADD FOREIGN KEY(ID_GENERO) REFERENCES GENERO(ID_GENERO);
ALTER TABLE FICHA ADD FOREIGN KEY(ID_GENERO_DOS) REFERENCES GENERO(ID_GENERO);
ALTER TABLE FICHA ADD FOREIGN KEY(ID_GENERO_TRES) REFERENCES GENERO(ID_GENERO);
Como se pueden dar cuenta, la tabla FICHA hace referencia a la tabla GENERO 3 veces. La idea, es que en la tabla genero, la llene por ejemplo con, Accion, Aventura, etc. Y luego, que cada ficha contenga hasta 3 generos distintos.

Pero luego, me da problemas al intentar mostrar los valores por pantalla. Pues si pongo por ejemplo:

Código:
SELECT F.ID_GENERO, F.ID_GENERO_DOS, F.ID_GENERO_TRES, G.ID_GENERO, G.NOMBRE_GENERO FROM FICHA F INNER JOIN GENERO G ON F.ID_GENERO = G.ID_GENERO INNER JOIN GENERO G ON F.ID_GENERO_DOS = G.ID_GENERO
Y asi hasta completear los 3 JOINS me da error. ¿Como lo harian ustedes?. Algun concejito por favor.
  #2 (permalink)  
Antiguo 17/01/2010, 02:42
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Un Consejito porfavor

Es mejor crear una tercera tabla
GENEROFICHA
con los campos
ID_GENEROFICHA INT AUTOINCREMENT (PK)
ID_FICHA INT (FK) RELACIONADO CON ID_FICHA de FICHA
ID_GENERO INT (FK) relacionado con ID_GENERO de GENERO

Imagina que los géneros TERROR, AVENTURAS, CIENCIA FICCIÓN tienen en la tabla GENERO los ID_GENERO 6, 4 y 8 respectivamente, y que una película, la ID_FICHA 200 de la tabla FICHA podría incluirse en cualquiera de esos tres géneros. Pues bien, estos serían los datos de GENEROFICHA de esa película
ID_GENERO_FICHA | ID_FICHA | ID_GENERO
1 | 200 | 6
2 | 200 | 4
3 | 200 | 8

Eso te permitiría referir 1, 2, 3, 4 o los géneros que quieras a una película. Lo otro que pides no es muy funcional. Puede hacerse volviendo a la tabla GENERO tres veces (en tu caso 3 veces), y en dos de esas veces como alias. Pero eso no es una buena estructura de base de datos. Imagina que buscas el género de terror. En tu estructura puedes tenerlo en ID_GENERO, ID_GENERO_DOS, ID_GENERO_TRES. Buscarlo y, si quieres, contarlo, será un verdadero problema, y eso por sólo citarte un problema.

Mi consejo es que crees esa tercera tabla.
  #3 (permalink)  
Antiguo 17/01/2010, 11:32
 
Fecha de Ingreso: enero-2010
Mensajes: 88
Antigüedad: 14 años, 3 meses
Puntos: 2
Respuesta: Un Consejito porfavor

Muchas gracias jurena. Intentaré hacerlo como dices .

Otra vez, muchas gracias
  #4 (permalink)  
Antiguo 18/01/2010, 15:30
 
Fecha de Ingreso: enero-2010
Mensajes: 88
Antigüedad: 14 años, 3 meses
Puntos: 2
Respuesta: Un Consejito porfavor

Lo he hecho como me sugirio el Sr, pero tengo un problemita al intentar mostrar la informacion en la web. Hago esto:

Código:
CREATE TABLE TITULO_GENERO(
 ID_TITULO INT NOT NULL, #FOREIGN KEY TITULO.ID_TITULO
 ID_GENERO INT NOT NULL  #FOREIGN KEY GENERO.ID_GENERO
);

ALTER TABLE TITULO_GENERO ADD FOREIGN KEY(ID_TITULO) REFERENCES TITULO(ID_TITULO);
ALTER TABLE TITULO_GENERO ADD FOREIGN KEY(ID_GENERO) REFERENCES GENERO(ID_GENERO);
Código:
$consulta = "SELECT F.ID_TITULO, F.IMAGEN_FICHA, F.PLATAFORMA, F.ID_GENERO, F.ID_DESARROLADOR, F.NUMERO, P.ID_PLATAFORMA, P.NOMBRE_PLATAFORMA, G.ID_GENERO, G.NOMBRE_GENERO, D.ID_DESARROLLADOR, D.NOMBRE_DESARROLLADOR
FROM FICHA F INNER JOIN PLATAFORMA P ON F.PLATAFORMA = P.ID_PLATAFORMA INNER JOIN GENERO G ON F.ID_GENERO = G.ID_GENERO INNER JOIN DESARROLLADOR D ON F.ID_DESARROLADOR = D.ID_DESARROLLADOR WHERE F.ID_TITULO =".$id;

$consulta2 = "SELECT T.ID_TITULO, G.ID_GENERO, G.NOMBRE_GENERO, TG.ID_TITULO, TG.ID_GENERO FROM TITULO T INNER JOIN TITULO_GENERO TG ON T.ID_TITULO = TG_ID_TITULO INNER JOIN GENERO G ON G.ID_GENERO = TG.ID_GENERO WHERE T.ID_TITULO =" ".$id;

$resultado = mysql_query($consulta);
$resultado2 = mysql_query($consulta2);

while($prox = mysql_fetch_array($resultado))
{
    echo '<span class="algo">'.$prox[''].'</span>;
    while($prox2 = mysql_fetch_array($resultado2))
    {
         $prox2['NOMBRE_GENERO'];
    }
    echo '<span class="algo">'.$prox2[''].'</span>';
}

Pero me da error, mi pregunta es ¿Como se hace cuando quiero hacer 2 consultas?.

De antemano muchas gracias
  #5 (permalink)  
Antiguo 18/01/2010, 16:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Un Consejito porfavor

Myless,
no pongas código PHP en este foro: está prohibido. Dinos exactamente qué buscas, con un ejemplo y te recomendaremos alguna consulta. Otra cosa distinta es el php; para eso debes pedir ayuda en el foro PHP, que creo que será lo que tendrás que hacer, aunque dinos antes lo que quieres por si aquí podemos ayudarte.

Etiquetas: Ninguno
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 17:07.