MySQL视图来自三个表

时间:2012-05-23 21:04:14

标签: mysql view many-to-many

我已经阅读了一堆帖子,书籍,观看过的视频等等,但SQL JOINS对我来说从来没有任何意义...... = /

所以这是交易...

三张桌子:

CREATE TABLE IF NOT EXISTS `feature` (  
  `feature_id` INT NOT NULL AUTO_INCREMENT ,  
  `title` VARCHAR(45) NOT NULL ,  
  `description` TEXT NOT NULL ,  
  PRIMARY KEY (`feature_id`) )  
ENGINE = InnoDB;  

CREATE TABLE IF NOT EXISTS `requirement` (  
  `requirement_id` INT NOT NULL AUTO_INCREMENT ,  
  `title` VARCHAR(45) NOT NULL ,  
  `description` TEXT NOT NULL ,  
  PRIMARY KEY (`requirement_id`) ,  
  UNIQUE INDEX `title_UNIQUE` (`title` ASC) )  
ENGINE = InnoDB;  

CREATE TABLE IF NOT EXISTS `feature_requirement` (  
  `fk_feature_id` INT NOT NULL ,  
  `fk_requirement_id` INT NOT NULL ,  
  PRIMARY KEY (`fk_feature_id`, `fk_requirement_id`) ,  
  INDEX `fk_feature_requirement_requirement1` (`fk_requirement_id` ASC) ,  
  INDEX `fk_feature_requirement_feature1` (`fk_feature_id` ASC) )  
ENGINE = InnoDB;  

某些功能可能有多个要求,某些功能具有相同的要求(即,相同的要求适用于多个功能)因此,第三个表用于多对多关系。

我希望能够选择特定功能的所有要求(通过feature_id),并且我正在尝试将其转换为VIEW。

关于“未知列”和“非唯一别名”的大量错误消息后;我终于让这个工作了:

CREATE VIEW `project_feature_requirement` AS  
SELECT r.*  
FROM `requirement` `r`  
INNER JOIN `feature_requirement` `fr`  
    on `r`.`requirement_id` = `fr`.`fk_requirement_id`  
INNER JOIN `feature` `f`  
    on `fr`.`fk_feature_id` = `f`.`feature_id`  

然而,这只给了我requirements_id,title,&虽然从SELECT描述。 ......这是没用的

我还有四个其他VIEW要创建,它们将是相同类型的查询。

非常感谢任何帮助!

是否有任何免费程序将查询我的架构并通过“向导”运行我或指定我想要哪些表/列以及我想要选择哪些列并为我构建查询? ?也许我最终可以弄清楚是否可以使用这样的实用程序。

再次感谢! 托德

1 个答案:

答案 0 :(得分:1)

这应该对您有用,但您应该在数据库中处理您的命名约定。在同一个查询中有多个名为title的字段可能会造成不必要的混淆:

CREATE VIEW `project_feature_requirement` AS  
    SELECT r.*, f.feature_id, f.title as ftitle, f.description as fdesc  
    FROM `requirement` `r`  
    INNER JOIN `feature_requirement` `fr`  
        on `r`.`requirement_id` = `fr`.`fk_requirement_id`  
    INNER JOIN `feature` `f`  
        on `fr`.`fk_feature_id` = `f`.`feature_id`

这可能是一种更清晰,更不容易出错的编写查询的方式:

SELECT r.*, f.feature_id, f.title as ftitle, f.description as fdesc  
FROM feature_requirement fr 
JOIN requirement r ON r.requirement_id=fr.fk_requirement_id
JOIN feature f on f.feature_id=fr.fk_feature_id