0

これは、これら4つのテーブルを結合する最も効率的な方法ですか?また、各テーブルの一部の行のみを選択することは可能ですか?*を列の名前に変更しようとしましたが、studentlistの列のみが許可されています。

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 ;
4

1 に答える 1

1

これは、これら3つのテーブルを結合する最も効率的な方法ですか?

あなたJOINは正しく見え、あなたはあなたの鍵に参加しています。したがって、これは効率的であるはずです。ただし、クエリを分析して、EXPLAIN追加の最適化を決定することをお勧めします。

各テーブルの一部の行のみを選択することは可能ですか?

はい。必要な各テーブルの列に変更*します。元のテーブルを明示的にプレフィックスとして付けることをお勧めします。選択した列によっては、クエリのパフォーマンスが向上する場合もあります。

SELECT studentlist.studentID, users.email FROM ...
于 2012-12-02T16:49:32.340 に答える