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

  • Autor Autor gmsegui
  • Fecha de inicio Fecha de inicio
G

gmsegui

Dseda
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.
 
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
 
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..
 
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:
Gracias.. voy a ver de hacerlo de esa forma. Y pegarle una mirada a inner join y on, saludos !
 
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!! 😀
 
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 ?
 
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 😉
 
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"
 
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 !
 
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.
 
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.
 
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 😉
 
Atrás
Arriba