Cómo vincular actores a películas en PHP y MySQL

Desde
10 Sep 2012
Mensajes
1.073
Hola, raro el titulo pasa que nose como poner ja...

Buen resulta que tengo una pagina de peliculas, con fotos, sinopsis, bla bla etc... y un base de datos tambien de actores.

En base de datos de peliculas hay cinco campos para agregar 5 actores, entonces en cada campo pongo por ejemplo id actor 1, 3, 6, 12, y 15.. Perfecto debajo de la pelicula busco en la base de actores los campos con id 1,3,6,12 y 15 y me muestra los actores con la fotito y todo.

El problema es... cuando voy a actores, por ejemplo la descripcion foto y vida de Vin Diesel, lo que deberia mostrar abajo seria algunas peliculas en las que trabajo, asi que lo que hice fue la inversa, busque en la base de datos de peliculas las peliculas que tengan en los campos actor1, actor2, actor3, actor4, actor5, el id del actor de Vin Diesel... y asi busca en esos 5 campos de todas las peliculas el id de ese actor.

Nose si se entiende, espero que si.

Lo que yo pienso es que si yo busco en todas las peliculas en los 5 campos esos un id, ahora que hay 100 peliculas no hay problema, pero cuando haya 5000 peliculas creo que va a tardar bastante tiempo en que recorra 5 campos de 5000 peliculas ja..

La pregunta es de que otra forma lo puedo realizar.
 

neburor

Dseda
Desde
1 Jul 2012
Mensajes
1.212
En los actores puedes tener un campo que indiquen las películas, y cuando des de alta nueva película y actores, se actualice, y para lo que ya tienes puedes hacerlo con php en automático, así cuando se consulte un actor ya se sabe en especifico que películas estubo
 

gmsegui

Dseda
Desde
10 Sep 2012
Mensajes
1.073
si pero si en actores tengo por ejemplo el campo peliculas, cada vez que agrego una pelicula deberia actualizar ese campo, por ejemplo ...

id 13
nombre Vindiesel
peliculas 133

Cuando agrego una nueva pelicula, deberia modificar el campo "peliculas"...

peliculas 133,134,

y luedo desglosar ese campo en cada coma, pero tampoco me queda muy claro si lo prodria hacer asi.

Alguna otra forma..
 

User

Beta
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
10 Mar 2013
Mensajes
130
NO, NO, NO ... eso no se hace , no olvidemos que MYSQL es un motor de BD relacional, pues entonces utilicemos relaciones... para lo que deseas hacer te serviria la siguiente estructura:
1- tabla 'pelicula' {id, nombre, año, etc, etc}
2- tabla 'actor' {id, nombre, biografia, etc, etc}
3- tabla 'actor_pelicula' {id_pelicula, id_actor}

eso te sirve perfectamente. saludos, si tienes mas dudas mandame un MP

PD: algunas consultas de ayuda:

- Obtener peliculas en las que a estado el actor con ID: 1
"SELECT pelicula.* FROM pelicula INNER JOIN actor_pelicula ON pelicula.id = actor_pelicula.id_pelicula WHERE actor_pelicula.id_actor = 1"

- Obtener actores que han estado en la pelicula con ID: 2
"SELECT actor.* FROM actor INNER JOIN actor_pelicula ON actor.id = actor_pelicula.id_actor WHERE actor_pelicula.id_pelicula = 2"
 
Última edición:

gamarro

Beta
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
26 Sep 2012
Mensajes
43
NO, NO, NO ... eso no se hace , no olvidemos que MYSQL es un motor de BD relacional, pues entonces utilicemos relaciones... para lo que deseas hacer te serviria la siguiente estructura:
1- tabla 'pelicula' {id, nombre, año, etc, etc}
2- tabla 'actor' {id, nombre, biografia, etc, etc}
3- tabla 'actor_pelicula' {id_pelicula, id_actor}

eso te sirve perfectamente. saludos, si tienes mas dudas mandame un MP

PD: algunas consultas de ayuda:

- Obtener peliculas en las que a estado el actor con ID: 1
"SELECT pelicula.* FROM pelicula INNER JOIN actor_pelicula ON pelicula.id = actor_pelicula.id_pelicula WHERE actor_pelicula.id_actor = 1"

- Obtener actores que han estado en la pelicula con ID: 2
"SELECT actor.* FROM actor INNER JOIN actor_pelicula ON actor.id = actor_pelicula.id_actor WHERE actor_pelicula.id_pelicula = 2"

Esto mismo iba a decir yo, es la mejor forma ya que si pusieras como te dicen arriba un campo películas en actores, habría redundancia en la base de datos porque existe la información 2 veces, y esto es lo que principalmente se evita en bases de datos.

Un saludo!! :D
 

gmsegui

Dseda
Desde
10 Sep 2012
Mensajes
1.073
NO, NO, NO ... eso no se hace , no olvidemos que MYSQL es un motor de BD relacional, pues entonces utilicemos relaciones... para lo que deseas hacer te serviria la siguiente estructura:
1- tabla 'pelicula' {id, nombre, año, etc, etc}
2- tabla 'actor' {id, nombre, biografia, etc, etc}
3- tabla 'actor_pelicula' {id_pelicula, id_actor}

eso te sirve perfectamente. saludos, si tienes mas dudas mandame un MP

PD: algunas consultas de ayuda:

- Obtener peliculas en las que a estado el actor con ID: 1
"SELECT pelicula.* FROM pelicula INNER JOIN actor_pelicula ON pelicula.id = actor_pelicula.id_pelicula WHERE actor_pelicula.id_actor = 1"

- Obtener actores que han estado en la pelicula con ID: 2
"SELECT actor.* FROM actor INNER JOIN actor_pelicula ON actor.id = actor_pelicula.id_actor WHERE actor_pelicula.id_pelicula = 2"

Me quedo una consulta, sorry.. Si yo quisiera agregar 5 actores como antes decia, agregaria dentro de la tabla actor_pelicula, campos id_pelicula, id_actor1, id_actor2, id_actor3, id_actor4, id_actor5 ?
 

gamarro

Beta
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
26 Sep 2012
Mensajes
43
Me quedo una consulta, sorry.. Si yo quisiera agregar 5 actores como antes decia, agregaria dentro de la tabla actor_pelicula, campos id_pelicula, id_actor1, id_actor2, id_actor3, id_actor4, id_actor5 ?

Buenas, no, la tabla tendría dos campos ACTOR y PELICULA, donde la clave serían los dos. Tendrias que meter parejas id_pelicula,id_actor pudiendo haber varias filas con el mismo id en alguna de las columnas.

Un ejemplo a la hora de añadir los actores de una pelicula sería:
Insertar CODE, HTML o PHP:
INSERT INTO actor_pelicula (pelicula, actor) VALUES
(30, 43),
(30, 20),
(30, 7),
(30, 19),
(30, 37);

Un saludo ;)
 

User

Beta
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
10 Mar 2013
Mensajes
130
Me quedo una consulta, sorry.. Si yo quisiera agregar 5 actores como antes decia, agregaria dentro de la tabla actor_pelicula, campos id_pelicula, id_actor1, id_actor2, id_actor3, id_actor4, id_actor5 ?

Como bien dice [MENTION=29830]gamarro[/MENTION] , para cada actor que desees agregar primero lo agregas a la tabla ACTOR, si luego a cada actor lo quieres relacionar con cualquier pelicula, para cada relacion ACTOR-PELICULA es un nuevo registro en la tabla "actor_pelicula"
 

gmsegui

Dseda
Desde
10 Sep 2012
Mensajes
1.073
Como bien dice [MENTION=29830]gamarro[/MENTION] , para cada actor que desees agregar primero lo agregas a la tabla ACTOR, si luego a cada actor lo quieres relacionar con cualquier pelicula, para cada relacion ACTOR-PELICULA es un nuevo registro en la tabla "actor_pelicula"

Me quedo claro, gracias a los dos !
 

Chapi

Delta
Programador
Verificación en dos pasos activada
Verificado por Whatsapp
Desde
2 Ago 2011
Mensajes
618
Lo que tal vez aun no te has dado cuenta es que de la tabla peliculas debes borrar los campos actor1, actor2, actorX dado que ya no son necesarios.
 

sysme

Beta
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
25 Mar 2012
Mensajes
55
Y ya si quieres que se actualice de forma automática, es decir, que si eliminas por ejemplo una peli también elimine su correspondiente entrada en actor_pelicula debes definir la tabla con claves ajenas:

Insertar CODE, HTML o PHP:
CREATE TABLE actor_pelicula (
id_pelicula int(6) not null,
id_actor int(6) not null,
primary key (id_pelicula,id_actor),
foreign key (id_pelicula) references pelicula.id_pelicula on delete cascade on update cascade,
foreign key (id_actor) references actor.id_actor on delete cascade on update cascade
)

Nota: los campos int(6) debes substituirlos por tu tipo de campo, igual que los nombres de campos y tablas claro.

Saludos.
 

gamarro

Beta
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
26 Sep 2012
Mensajes
43
Y ya si quieres que se actualice de forma automática, es decir, que si eliminas por ejemplo una peli también elimine su correspondiente entrada en actor_pelicula debes definir la tabla con claves ajenas:

Insertar CODE, HTML o PHP:
CREATE TABLE actor_pelicula (
id_pelicula int(6) not null,
id_actor int(6) not null,
primary key (id_pelicula,id_actor),
foreign key (id_pelicula) references pelicula.id_pelicula on delete cascade on update cascade,
foreign key (id_actor) references actor.id_actor on delete cascade on update cascade
)

Nota: los campos int(6) debes substituirlos por tu tipo de campo, igual que los nombres de campos y tablas claro.

Saludos.

Bueno pero para las foreign key la base de datos tiene que ser relacional, y lo normal es que use MyISAM... por lo que para borrar las relaciones con los actores al borrar una película tendría que hacer otra consulta que borre todas las filas de la tabla actor_pelicula que tengan en el campo pelicula el id de la que se está borrando. Ejemplo:
Insertar CODE, HTML o PHP:
DELETE FROM peliculas WHERE id=7;

DELETE FROM actor_pelicula WHERE pelicula=7;

Un saludo ;)
 
Arriba