最初に、これが既知の回答済みの質問である場合に謝罪したいと思いますが、英語は私の母国語ではなく、そのような質問を検索する方法さえわかりません。だからここに行きます。
movie という名前のテーブルがあります。このテーブルには、映画に関する情報が保持されます。映画の監督と作家も、私が保存する情報の中にあります. ただし、ディレクターとライターはどちらも多値属性です。多値として新しいテーブルに格納する必要がありますが、それらのテーブルは映画テーブルと多対多の関係を持つため、4 つの新しいテーブルを作成しました。
監督→監督→MOVIE ライター→脚本→MOVIE
[ディレクター] と [ライター] は名前 lastanames と Id をキー属性として保持します。[監督]、[執筆] は、ディレクターとライターのテーブルからの ID キーと、映画のテーブルからのキーを保持します。
特定の映画(3人の監督と2人の作家がいる)の監督と作家の名前を尋ねると、次のような結果が得られます::
D.Name D.Lastname W.Name W.Lastname
----------------------------------------------
Jan Kounen Stanley Kubric
Albert Hughes Stanley Kubric
Len Wiseman Stanley Kubric
Jan Kounen Alan Moore
Albert Hughes Alan Moore
Len Wiseman Alan Moore
ユニオンクエリを使用すると、必要な5つの名前だけを取得できますが、誰が監督で誰が作家であるかを理解できる方法ではありません.
Jan Kounen
Albert Hughes
Len Wiseman
Stanley Kubric
Alan Moore
しかし、すべて取締役としてリストされています。
私の質問は、私の設計に欠陥がありますか? 私のクエリは間違っていますか?複数の応答なしに 1 つのクエリでディレクターとライターを取得する方法はありますか?
前もって感謝します。
編集::::
返信ありがとうございます。
関係の画像をアップロードしようとしましたが、許可されませんでした。問題のテーブルのコードは次のとおりです
CREATE TABLE IF NOT EXISTS `Red_Apple_storeDB`.`directed_by` (`Direc_id` INT(11) NOT NULL ,
`Db_Title` VARCHAR(50) NOT NULL ,
PRIMARY KEY (`Direc_id`, `Db_Title`) ,
INDEX `fk_Director_has_Movie_Movie1_idx` (`Db_Title` ASC) ,
INDEX `fk_Director_has_Movie_Director1_idx` (`Direc_id` ASC) ,
CONSTRAINT `fk_Director_has_Movie_Director1`
FOREIGN KEY (`Direc_id` )
REFERENCES `Red_Apple_storeDB`.`director` (`D_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Director_has_Movie_Movie1`
FOREIGN KEY (`Db_Title` )
REFERENCES `Red_Apple_storeDB`.`movie` (`MV_Title` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
CREATE TABLE IF NOT EXISTS `Red_Apple_storeDB`.`director` (`D_Name` VARCHAR(50) NOT NULL ,
`D_lastname` VARCHAR(45) NOT NULL ,
`D_id` INT(11) NOT NULL ,
PRIMARY KEY (`D_id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
CREATE TABLE IF NOT EXISTS `Red_Apple_storeDB`.`movie` (`MV_Title` VARCHAR(50) NOT NULL ,
`MV_Release_Date` DATE NOT NULL ,
`MV_Cost` BIGINT(20) NOT NULL ,
`St_Name` VARCHAR(50) NOT NULL ,
PRIMARY KEY (`MV_Title`) ,
INDEX `fk_Movie_Studio1_idx` (`St_Name` ASC) ,
CONSTRAINT `fk_Movie_Studio1`
FOREIGN KEY (`St_Name` )
REFERENCES `Red_Apple_storeDB`.`studio` (`ST_Name` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
CREATE TABLE IF NOT EXISTS `Red_Apple_storeDB`.`writen_by` (`Writ_id` VARCHAR(45) NOT NULL ,
`Wb_Title` VARCHAR(50) NOT NULL ,
PRIMARY KEY (`Writ_id`, `Wb_Title`) ,
INDEX `fk_Writer_has_movie_movie1_idx` (`Wb_Title` ASC) ,
INDEX `fk_Writer_has_movie_Writer1_idx` (`Writ_id` ASC) ,
CONSTRAINT `fk_Writer_has_movie_Writer1`
FOREIGN KEY (`Writ_id` )
REFERENCES `Red_Apple_storeDB`.`writer` (`W_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Writer_has_movie_movie1`
FOREIGN KEY (`Wb_Title` )
REFERENCES `Red_Apple_storeDB`.`movie` (`MV_Title` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
CREATE TABLE IF NOT EXISTS `Red_Apple_storeDB`.`writer` (`W_Name` VARCHAR(50) NOT NULL ,
`W_Lastname` VARCHAR(45) NULL DEFAULT NULL ,
`W_id` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`W_id`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1
私が頼む映画には、3 人の監督と 2 人の脚本家がいます。
私のクエリ::
select d_name, d_lastname,d_id
from director, movie,directed_by
where mv_title = 'from hell'
and mv_title = db_title
and direc_id = d_id
union all
select w_name, w_lastname,w_id
from movie, writer, writen_by
where mv_title = 'from hell'
and mv_title = wb_title
and writ_id = w_id