我已经阅读了一堆帖子,书籍,观看过的视频等等,但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要创建,它们将是相同类型的查询。
非常感谢任何帮助!
是否有任何免费程序将查询我的架构并通过“向导”运行我或指定我想要哪些表/列以及我想要选择哪些列并为我构建查询? ?也许我最终可以弄清楚是否可以使用这样的实用程序。
再次感谢! 托德
答案 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