Thomas
Thomas

Reputation: 1706

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 ;

Upvotes: 0

Views: 215

Answers (1)

Jason McCreary
Jason McCreary

Reputation: 72981

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 ...

Upvotes: 1

Related Questions