2013-11-20 101 views
0

我有以下各表查詢SQL多個表

簿表

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; 

課程表

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; 

模塊表

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; 

模塊課程表SQL數據庫

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 ; 

我想查詢數據庫以顯示課程的所有書籍詳細信息。一門課程有很多模塊和模塊都有很多書。我試過以下查詢,但我認爲我的表格也有問題。 (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' 
+0

是什麼在書mod_id代表什麼?如果它應該是模塊,那麼表示關係的方式就不好,因爲一本書可能在多個模塊中。所以你可能想擺脫這一點。 – navinpai

+0

請不要污衊你的問題,或試圖詆譭那些幫助你的人的答案。 –

回答

0

我有更深入的瞭解,並提供以下建議,其中包括更改數據模型也。這個解決方案還將允許您爲幾個模塊使用同一本書(如果將來需要的話)。還要注意新表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 ; 

和查詢將

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' 
0

的關鍵字之後加入它應該是不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 
+0

當然編輯了連接條件 – Santhosh

0

基於所述規定關係課程 - >模塊 - >書籍,您應該從書籍表中放下courseid列。你擁有的modid是你所需要的。

與您的查詢問題是缺少連接條件。 的JOIN mod_course MC線之下,你應該在這個加 ON mc.module = b.mod_id