简体   繁体   English

查询SQL多表

[英]Querying SQL multiple tables

I have a sql database with the following tables 我有一个带有下表的sql数据库

Book Table 书桌

CREATE TABLE IF NOT EXISTS `books` (
`book_id` varchar(8) NOT NULL DEFAULT '',
`book_title` varchar(100) DEFAULT NULL,
`author1` varchar(20) NOT NULL,
`author2` varchar(20) DEFAULT NULL,
`publisher` varchar(20) NOT NULL,
`pub_year` year(4) NOT NULL,
`mod_id` varchar(8) NOT NULL,
`courseID` varchar(8) NOT NULL,
PRIMARY KEY (`book_id`),
KEY `id` (`book_id`),
KEY `book_id` (`book_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Courses Table 课程表

CREATE TABLE IF NOT EXISTS `courses` (
`courseID` varchar(8) NOT NULL,
`course_title` varchar(255) CHARACTER SET ascii NOT NULL,
`Entry_Year` int(1) NOT NULL,
`Duration` int(1) NOT NULL,
PRIMARY KEY (`courseID`),
KEY `courseID` (`courseID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Modules Table 模块表

CREATE TABLE IF NOT EXISTS `modules` (
`mod_id` varchar(8) NOT NULL,
`mod_title` varchar(255) NOT NULL,
`description` varchar(255) NOT NULL,
 PRIMARY KEY (`mod_id`),
 KEY `mod_title` (`mod_title`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Module Course Table 模块课程表

CREATE TABLE IF NOT EXISTS `mod_course` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`module` varchar(8) NOT NULL,
`course` varchar(8) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=31 ;

I would like to query the database to show all book details of a course. 我想查询数据库以显示课程的所有书籍详细信息。 A course has many modules and modules have many books. 一门课程有很多模块,而模块有很多书。 I have tried the following query but I think there is a problem with my tables as well. 我已经尝试了以下查询,但是我认为表也存在问题。 (FYI 'BIT' is the id of a course that is in the module course table) (FYI“ BIT”是模块课程表中课程的ID)

SELECT b.book_id, b.book_title, b.author1, b.author2, b.publisher, b.pub_year, b.mod_id, mc.course
                        FROM books b
                         JOIN mod_course mc
                        WHERE mc.course = 'BIT'

After the keyword Join it should be ON not WHERE 在关键字Join之后,它应该在ON WHERE上

SELECT B.*, MC.COURSE
FROM MODULECOURSE AS MC
INNER JOIN COURSES AS C
ON C.COURSE_TITLE = MC.COURSE
INNER JOIN BOOKS AS B
ON B.COURSEID= C.COURSEID

based on the stated relationship course->module->books, you should drop the courseid column from the books table. 根据声明的课程->模块->书籍的关系,您应该从书籍表中删除课程ID列。 the modid that you have is all you need. 您所需要的一切就是您所需要的。

the problem with your query is the missing join condition. 您查询的问题是缺少联接条件。 below the JOIN mod_course mc line you should add ON mc.module = b.mod_id 在JOIN mod_course mc行下面,您应该添加ON mc.module = b.mod_id

I have had a deeper look at this and offer the following suggestion which includes changes to the data model also. 我对此进行了更深入的研究,并提出了以下建议,其中还包括对数据模型的更改。 This solution will also allow you to have the same book used for several modules (if required in the future). 该解决方案还将使您拥有用于多个模块的同一本书(如果将来需要的话)。 Also note the new table mod_books The full code for this (including the query) is below... hope its ok 还要注意新表mod_books的完整代码(包括查询)在下面...希望它可以

CREATE TABLE IF NOT EXISTS books
(book_id varchar(8) NOT NULL DEFAULT '',
 book_title varchar(100) DEFAULT NULL,
 author1 varchar(20) NOT NULL,
 author2 varchar(20) DEFAULT NULL,
 publisher varchar(20) NOT NULL,
 pub_year year(4) NOT NULL,
PRIMARY KEY (book_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS courses
(course_ID varchar(8) NOT NULL,
 course_title varchar(255) CHARACTER SET ascii NOT NULL,
 Entry_Year int(1) NOT NULL,
 Duration int(1) NOT NULL,
 PRIMARY KEY (course_ID)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS modules
(mod_id varchar(8) NOT NULL,
 mod_title varchar(255) NOT NULL,
 description varchar(255) NOT NULL,
 PRIMARY KEY (mod_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS mod_books
(mod_id varchar(8) NOT NULL,
 book_id varchar(8) NOT NULL,
 PRIMARY KEY (mod_id,book_id),
 FOREIGN KEY (mod_id) REFERENCES modules (mod_id),
 FOREIGN KEY (book_id) REFERENCES books (book_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS mod_course
(ID int(11) NOT NULL AUTO_INCREMENT,
 mod_id varchar(8) NOT NULL,
 course_ID varchar(8) NOT NULL,
 PRIMARY KEY (ID),
FOREIGN KEY (mod_id) REFERENCES modules (mod_id),
FOREIGN KEY (course_ID) REFERENCES courses (course_ID)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=31 ;

and the query would be 和查询将是

SELECT  b.*
FROM    mod_course mc
INNER JOIN mod_books mb
    ON mb.mod_id = mc.mod_id
    INNER JOIN books b
    ON b.book_id = mb.book_id
WHERE   mc.course_id = 'BIT'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM