简体   繁体   中英

SQL query; inner join on 4 tables

Is this the most efficient way of joining these 4 tables? Also is it possible to only have some rows of each tables selected? I tried changing * to a name of a column but only the columns from studentlist are allowed.

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

Database structure:

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 ;

Is this the most efficient way of joining these 3 tables?

Your JOIN looks correct and you are joining on your keys. So this should be efficient. However, I would encourage you to analyze your query with EXPLAIN to determine additional optimizations.

Is it possible to only have some rows of each tables selected?

Yes. Change * to be the columns from each table you want. I encourage you to explicitly prefix them with the originating table. Depending on the columns you select, this could also make your query more performant.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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