mysql - SQL 查询和结果

标签 mysql join union normalization

首先,如果这是一个已知且已回答的问题,但我想道歉,但英语不是我的母语,我什至不知道如何搜索这样的问题。就这样吧。

我有一个名为 movie 的表。该表包含有关电影的信息。电影的导演和编剧也在我存储的信息中。但导演和编剧都是多值属性。作为多值,它们应该存储在新表中,但是这些表将与电影表有多对多的关系,所以我制作了四个新表。

导演 -> 导演 -> 电影 作家 -> 写作 -> 电影

[Director] 和 [writer] 将名称 lastanames 和一个 Id 作为关键属性。 [directed]、[wrote] 持有 director 和 writer 表中的 id 键以及 movie 表中的键。

当我询问某部电影(有 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

如果我使用联合查询,我只能得到我想要的五个名字,但我无法理解谁是导演谁是编剧。

Jan     Kounen  
Albert  Hughes  
Len     Wiseman 
Stanley Kubric  
Alan    Moore   

但都列为董事。

所以我的问题是,我的设计有缺陷吗?我的查询错了吗?有没有一种方法可以让导演和编剧只用一次查询而不需要多次回复?

提前致谢。

编辑::::

谢谢大家的回复。

我试图为关系上传图片,但不允许。 所以这是相关表格的代码

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

最佳答案

在您的选择查询中添加一个简单命名为 Writer 或 Producer 的列。

SELECT .... , 'Writer' AS Type
UNION ALL
SELECT .... , 'Producer' AS Type

当您向我提供完整的表结构时,如果您愿意,我可以为您提供整个查询。

关于mysql - SQL 查询和结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14361290/

相关文章:

php - MySQL 结合复杂查询和优化功能

MySQL 子查询语法错误

PHP MYSQL 联合查询

mysql - MYSQL 上的连接语法

MySQL - 如何创建一个新表,该表是两个现有表的主键连接

mysql - 根据子查询中返回的 id 对多个表进行连接并保持该顺序

sql - 两个表的并集,但显示数据来自哪个表

php - 在内部页面上索引和搜索文本的最佳解决方案?

mysql - Laravel DB 查询连接多个表并获取条件数据

php - mysql中两个表的联合结果集排序