2012-12-02 2 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

xx 결과를 함께 그룹화 할 수 있습니까? 모든 수업에 대해 새로운 div를 만들고 그 수업에 학생들을 보여주고 싶습니다. – Thomas

+0

다른 내부 조인을 추가했습니다. 아직도 효율적인가요? – Thomas

+0

* 열이 아닌 행 *. 파생 테이블을 사용하여 또는 [JOIN에 절에 추가 조건] 각 테이블 * * 일부 행을 선택 (http://dev.mysql.com/doc/refman/5.6/en/join.html). "ON과 함께 사용되는 conditional_expr은 WHERE 절에서 사용할 수있는 양식의 조건부 표현식입니다. 일반적으로 테이블을 조인하는 방법을 지정하는 조건에는 ON 절을 사용하고 원하는 행을 제한하려면 WHERE 절을 사용해야합니다 결과 세트. " 유지할 것인지 결정하기 전에 이러한 메소드 (파생 테이블 대 WHO의 JOIN 조건 조건)에 대한 EXPLAIN 계획을 읽으십시오. –