2015-01-06 3 views
1

저는 Exam System에서 일하고 있습니다. 나는 (학생), (student_test), (테스트), (부서) 테이블이 서로 관계가 있습니다. 모든 학생들이 로그인 할 때 테스트 페이지를 찍기 위해 리디렉션 할 테스트를 호출하는 링크가 있습니다.멀티 테이블 콘텐츠 선택

질문 : 학생이 시험에 참석하지 않은 경우에만 테스트 테이블에서 학생 부서 테스트와 관련된 모든 것을 사용할 수 있습니까? 예를 들어 학생이 수행하지 않은 테스트 테이블에서 모든 테스트를 수행하는 방법은 무엇입니까?

$select=$connection->query("SELECT 
    student.std_id, 
    student.department, 
    test.depart_id, 
    test.test_id, 
    test.test_name, 
    test.test_from, 
    std_test.stdid, 
    std_test.std_test_id 
FROM student 
    INNER JOIN test 
    ON student.department = test.depart_id 
    INNER JOIN std_test 
    ON std_test.std_test_id <> test.test_id 

이 코드도 시도했지만 결과는 아닙니다.

SELECT 
    student.std_id, 
    student.department, 
    test.depart_id, 
    test.test_id, 
    test.test_name, 
    test.test_from, 
    std_test.stdid, 
    std_test.std_test_id 
FROM student 
    INNER JOIN test 
    ON student.department = test.depart_id 
    INNER JOIN std_test 
    ON std_test.std_test_id <> test.test_id 
WHERE test.test_id <> std_test.std_test_id AND student.std_id <> std_test.stdid 

스키마 스크립트

CREATE TABLE student (
    std_id int(11) NOT NULL AUTO_INCREMENT, 
    name varchar(50) NOT NULL, 
    f_name varchar(50) NOT NULL, 
    department int(11) NOT NULL, 
    semester varchar(255) NOT NULL, 
    pass varchar(255) NOT NULL, 
    email varchar(60) NOT NULL, 
    rollnumber varchar(20) NOT NULL, 
    PRIMARY KEY (std_id), 
    INDEX department (department), 
    UNIQUE INDEX email (email), 
    CONSTRAINT student_ibfk_1 FOREIGN KEY (department) 
    REFERENCES departments (dep_id) ON DELETE RESTRICT ON UPDATE RESTRICT 
) 
ENGINE = INNODB 
AUTO_INCREMENT = 8 
AVG_ROW_LENGTH = 8192 
CHARACTER SET latin1 
COLLATE latin1_swedish_ci; 

CREATE TABLE test (
    test_id int(11) NOT NULL AUTO_INCREMENT, 
    test_name varchar(80) NOT NULL, 
    test_date varchar(30) NOT NULL, 
    test_from datetime NOT NULL, 
    test_to datetime NOT NULL, 
    test_code varchar(30) NOT NULL, 
    test_conducter varchar(30) NOT NULL, 
    test_duration int(11) NOT NULL, 
    total_question int(11) NOT NULL, 
    session varchar(50) DEFAULT NULL, 
    subject_id int(11) NOT NULL, 
    semester_id int(11) NOT NULL, 
    depart_id int(11) NOT NULL, 
    status varchar(50) NOT NULL, 
    PRIMARY KEY (test_id), 
    INDEX depart_id (depart_id), 
    INDEX semester_id (semester_id), 
    INDEX subject_id (subject_id, semester_id, depart_id), 
    CONSTRAINT test_ibfk_1 FOREIGN KEY (subject_id) 
    REFERENCES subjects (id) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT test_ibfk_2 FOREIGN KEY (semester_id) 
    REFERENCES semester (sem_id) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT test_ibfk_3 FOREIGN KEY (depart_id) 
    REFERENCES departments (dep_id) ON DELETE CASCADE ON UPDATE CASCADE 
) 
ENGINE = INNODB 
AUTO_INCREMENT = 6 
AVG_ROW_LENGTH = 16384 
CHARACTER SET latin1 
COLLATE latin1_swedish_ci; 

CREATE TABLE std_test (
    stdid int(11) NOT NULL, 
    std_test_id int(11) NOT NULL, 
    starttime timestamp DEFAULT CURRENT_TIMESTAMP, 
    endtime timestamp DEFAULT '0000-00-00 00:00:00', 
    progress enum ('over', 'inprogress') NOT NULL, 
    PRIMARY KEY (std_test_id), 
    INDEX stdid (stdid), 
    INDEX tstid (std_test_id), 
    CONSTRAINT std_test_ibfk_2 FOREIGN KEY (std_test_id) 
    REFERENCES test (test_id) ON DELETE RESTRICT ON UPDATE RESTRICT, 
    CONSTRAINT std_test_ibfk_3 FOREIGN KEY (stdid) 
    REFERENCES student (std_id) ON DELETE RESTRICT ON UPDATE RESTRICT 
) 
ENGINE = INNODB 
AVG_ROW_LENGTH = 16384 
CHARACTER SET latin1 
COLLATE latin1_swedish_ci; 
+0

당신은 저를 보여줄 수 너의 테이블 구조? –

+0

나는 스키마 스크립트가 student.std_id, student.department, test.depart_id, test.test_id, test.test_name, test.test_from, std_test.stdid, 학생 FROM 을 std_test.std_test_id을 선택 – hameed

답변

0

검증되지 않은 및 단축, 그러나 이것은 내가

SELECT .... 
FROM student s 
INNER JOIN test t ON t.depart_id = s.department 
LEFT JOIN std_test st ON t.test_id = st.std_test_id 
WHERE st.stdid IS NULL 

작동합니다 질문을 읽을 때 내가 이해 무엇이며, 지금

+0

추가 LEFT는 student.department = test.depart_id에서 테스트 가입 INNER가 ON 을 std_test 가입 std_test.std_test_id <> test.test_id test.test_id이 가 대답 – hameed

+0

작동하지 NULL IS 요 주셔서 감사합니다 u 응답. 그러나 코드는 테스트를 수행하지 않은 모든 사용자를 테스트하지 않습니다. 내가 원하는 것은 아직 시험을 보지 않은 학생 ID를 기반으로 모든 테스트를 테스트 테이블에서 가져 와서 이미 테스트에 참석 한 모든 테스트를 숨기는 것입니다. –

+0

편집을 참조하십시오 – hameed