2012-12-02 130 views
0

這是連接這4個表的最有效方式嗎?也有可能只選擇每個表的一些行?我嘗試將*更改爲列的名稱,但只允許來自studentlist的列。SQL查詢;內連接4個表

SELECT c.classID, c.instrument, c.grade, u.ID, u.firstname, u.lastname, u.lastsongplayed, u.title 
FROM studentlist s 
INNER JOIN classlist c ON s.listID = c.classID 
INNER JOIN (

SELECT * 
FROM users u 
INNER JOIN library l ON u.lastsongplayed = l.fileID 
) 

u ON s.studentID = u.ID 
    WHERE teacherID =3 
    ORDER BY classID 
    LIMIT 0 , 30 

數據庫結構:

CREATE TABLE IF NOT EXISTS `classlist` (
    `classID` int(11) NOT NULL AUTO_INCREMENT, 
    `teacherID` int(11) NOT NULL, 
    `instrument` text, 
    `grade` int(11) DEFAULT NULL, 
    PRIMARY KEY (`classID`), 
    KEY `teacherID_2` (`teacherID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=27 ; 


CREATE TABLE IF NOT EXISTS `studentlist` (
    `listID` int(11) NOT NULL, 
    `studentID` int(11) NOT NULL, 
    KEY `teacherID` (`studentID`), 
    KEY `studentID` (`studentID`), 
    KEY `listID` (`listID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


CREATE TABLE IF NOT EXISTS `users` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `email` varchar(60) NOT NULL, 
    `password` varchar(60) NOT NULL, 
    `firstname` text NOT NULL, 
    `lastname` text NOT NULL, 
    `sessionID` varchar(60) DEFAULT NULL, 
    `lastlogin` time DEFAULT NULL, 
    `registerdate` date NOT NULL, 
    `isteacher` tinyint(1) DEFAULT NULL, 
    `isstudent` tinyint(1) DEFAULT NULL, 
    `iscomposer` tinyint(1) DEFAULT NULL, 
    `lastsongplayed` int(11) NOT NULL, 
    PRIMARY KEY (`ID`), 
    UNIQUE KEY `ID` (`ID`), 
    UNIQUE KEY `email` (`email`,`sessionID`), 
    KEY `ID_2` (`ID`), 
    KEY `ID_3` (`ID`), 
    KEY `lastsongplayed` (`lastsongplayed`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=63 ; 

CREATE TABLE IF NOT EXISTS `library` (
    `fileID` int(11) NOT NULL AUTO_INCREMENT, 
    `userID` int(11) NOT NULL, 
    `uploaddate` datetime NOT NULL, 
    `title` varchar(60) NOT NULL, 
    `OrigComposer` varchar(60) NOT NULL, 
    `composer` varchar(60) NOT NULL, 
    `genre` varchar(60) DEFAULT NULL, 
    `year` year(4) DEFAULT NULL, 
    `arrangement` varchar(60) DEFAULT NULL, 
    PRIMARY KEY (`fileID`), 
    KEY `userID` (`userID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=77 ; 

回答

1

這是連接這些表3的最有效的方法是什麼?

你的JOIN看起來是正確的,你加入你的鑰匙。所以這應該是有效的。不過,我鼓勵你用EXPLAIN分析你的查詢來確定額外的優化。

是否有可能只選擇每個表的一些行?

是的。將*更改爲您想要的每個表中的列。我鼓勵你明確地將它們作爲前綴表的前綴。根據您選擇的列,這也可以使您的查詢更高性能。

SELECT studentlist.studentID, users.email FROM ... 
+0

thx是否可以將結果組合在一起?我想爲每個班級製作一個新的分區,然後向該班的同學展示。 – Thomas

+0

我已經添加了另一個內連接;它仍然有效嗎? – Thomas

+0

*行*,而不是列。通過使用派生表或通過[向JOIN子句添加條件](http://dev.mysql.com/doc/refman/5.6/en/join.html)選擇每個表的* some *行。 「與ON一起使用的conditional_expr是可以在WHERE子句中使用的任何形式的條件表達式。通常,您應該使用ON子句來指定如何連接表的條件,以及WHERE子句來限制所需的行結果集「。在決定保留哪些方法之前,請閱讀這些方法的EXPLAIN計劃(派生表與條件中的JOIN和WHERE)。 –