tengo esta tabla:
ID | genre_id | is_best_in_genre | movie_name -------------------------------- 1 | 3 | 0 | Hateful Eight 2 | 3 | 0 | Django Unchained 2 | 3 | 1 | Inglorious B 2 | 3 | 0 | Once Upon A Time in Hollywood is_best_in_genre solo puede ser verdadero (1) una vez por cada genre_id . Solo puede haber 1 mejor película en cada género. ¿Cómo haría una restricción como esta?
Idea alternativa:
La forma más adecuada y normalizada de manejar esto es probablemente hacer una tabla 'best_in_genre' separada con una restricción única en genre_id .
Esto también es más fácil de actualizar, porque no es necesario que se asegure de que todo esté en 0 al seleccionar un nuevo 'mejor'.
Un mejor enfoque podría ser "mover" la columna is_best_in_genre a una tabla separada (unida). Una tabla simple con dos columnas podría hacer el trabajo:
CREATE TABLE best ( idmovie int, idgenre int, PRIMARY KEY (idgenre))Esto tendría que ser unido con la tabla original como:
SELECT m.*, CASE b.idmovie>0 THEN 1 ELSE 0 END best_in_genre FROM movietable m LEFT JOIN best b ON idmovie=id AND idgenre=genre_id La restricción PRIMARY KEY best la tabla se asegurará de que cada género solo pueda aparecer una vez.