2013-07-17 44 views
0

我有以下模式使用多個選擇從不同的表連接數據

CREATE TABLE years (
year_id INT NOT NULL AUTO_INCREMENT, 
year_name_in_nums int NOT NULL, 
year_name_in_text varchar(255) NOT NULL, 
PRIMARY KEY (year_id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE classes (
class_id INT NOT NULL AUTO_INCREMENT, 
class_name varchar(255) NOT NULL, 
PRIMARY KEY (class_id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE students (
student_id INT NOT NULL AUTO_INCREMENT, 
student_names varchar(255) NOT NULL, 
student_telephone_number int NOT NULL, 
PRIMARY KEY (student_id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE terms (
term_id INT NOT NULL AUTO_INCREMENT, 
term_name_in_nums int NOT NULL, 
term_name_in_text varchar(255) NOT NULL, 
term_year int NOT NULL, 
PRIMARY KEY (term_id), 
FOREIGN KEY (term_year) REFERENCES years(year_id) ON DELETE CASCADE ON UPDATE CASCADE 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE class_students (
cs_id INT NOT NULL AUTO_INCREMENT, 
cs_class_student int NOT NULL, 
cs_class_id int NOT NULL, 
cs_term_id int NOT NULL, 
PRIMARY KEY (cs_id), 
FOREIGN KEY (cs_class_student) REFERENCES students(student_id) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY (cs_class_id) REFERENCES classes(class_id) ON DELETE CASCADE ON UPDATE CASCADE, 
FOREIGN KEY (cs_term_id) REFERENCES terms(term_id) ON DELETE CASCADE ON UPDATE CASCADE 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我希望顯示條款表term_name_in_numsyear_name_in_nums從幾年表

我檢索到的數據這樣

(select term_name_in_nums,term_year from terms INNER JOIN class_students ON term_id=cs_term_id); 

從上面可以看出,term_year是一個FOREIGN KEY(term_year),其參考年(year_id)

我想這

(select term_name_in_nums from terms INNER JOIN class_students ON term_id=cs_term_id) 
    LEFT JOIN 
(select term_year from terms INNER JOIN class_students ON term_id=cs_term_id); 

這給了我一個SQL語法error.How我能解決這個問題?

編輯:數據

-- -------------------------------------------------------- 
-- Host:       127.0.0.1 
-- Server version:    5.6.11 - MySQL Community Server (GPL) 
-- Server OS:     Win32 
-- HeidiSQL Version:    8.0.0.4396 
-- -------------------------------------------------------- 

/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET NAMES utf8 */; 
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 
-- Dumping data for table algo.classes: ~10 rows (approximately) 
/*!40000 ALTER TABLE `classes` DISABLE KEYS */; 
INSERT IGNORE INTO `classes` (`class_id`, `class_name`) VALUES 
    (1, '1'), 
    (2, '2'), 
    (3, '3'), 
    (4, '4'), 
    (5, '5'), 
    (6, '6'), 
    (7, '7'), 
    (8, '8'), 
    (9, '9'), 
    (10, '10'); 
/*!40000 ALTER TABLE `classes` ENABLE KEYS */; 

-- Dumping data for table algo.class_students: ~16 rows (approximately) 
/*!40000 ALTER TABLE `class_students` DISABLE KEYS */; 
INSERT IGNORE INTO `class_students` (`cs_id`, `cs_class_student`, `cs_class_id`, `cs_term_id`) VALUES 
    (1, 1, 1, 1), 
    (2, 1, 1, 1), 
    (3, 2, 1, 1), 
    (4, 3, 1, 1), 
    (5, 4, 1, 1), 
    (6, 5, 1, 1), 
    (7, 6, 1, 1), 
    (8, 7, 1, 1), 
    (9, 8, 1, 1), 
    (10, 9, 1, 1), 
    (11, 10, 1, 1), 
    (12, 11, 1, 1), 
    (13, 12, 1, 1), 
    (14, 13, 1, 1), 
    (15, 14, 1, 1), 
    (16, 15, 1, 1); 
/*!40000 ALTER TABLE `class_students` ENABLE KEYS */; 

-- Dumping data for table algo.examinations: ~3 rows (approximately) 
/*!40000 ALTER TABLE `examinations` DISABLE KEYS */; 
INSERT IGNORE INTO `examinations` (`examination_id`, `examination_name`, `examination_term_id`) VALUES 
    (1, 'start of term', 1), 
    (2, 'mid term', 1), 
    (3, 'end of term', 1); 
/*!40000 ALTER TABLE `examinations` ENABLE KEYS */; 

-- Dumping data for table algo.examination_data: ~0 rows (approximately) 
/*!40000 ALTER TABLE `examination_data` DISABLE KEYS */; 
/*!40000 ALTER TABLE `examination_data` ENABLE KEYS */; 

-- Dumping data for table algo.students: ~20 rows (approximately) 
/*!40000 ALTER TABLE `students` DISABLE KEYS */; 
INSERT IGNORE INTO `students` (`student_id`, `student_names`, `student_telephone_number`) VALUES 
    (1, 'aa', 123456), 
    (2, 'bb', 5576899), 
    (3, '23050359165419520', 788399), 
    (4, '23050359165419521', 7892020), 
    (5, '23050359165419522', 33772), 
    (6, '23050359165419523', 86729), 
    (7, '23050359165419524', 526890), 
    (8, '23050359165419525', 444332), 
    (9, '23050359165419526', 937678), 
    (10, '23050359165419527', 44), 
    (11, '23050359165419528', 774), 
    (12, '23050359165419529', 2147483647), 
    (13, '23050359165419531', 2147483647), 
    (14, '23050359165419533', 2147483647), 
    (15, '23050359165419535', 353657674), 
    (16, '23050359165419536', 436), 
    (17, '23050359165419537', 5467), 
    (18, '23050359165419538', 565788), 
    (19, '23050359165419539', 548759898), 
    (20, '23050359165419540', 2443); 
/*!40000 ALTER TABLE `students` ENABLE KEYS */; 

-- Dumping data for table algo.terms: ~10 rows (approximately) 
/*!40000 ALTER TABLE `terms` DISABLE KEYS */; 
INSERT IGNORE INTO `terms` (`term_id`, `term_name_in_nums`, `term_name_in_text`, `term_year`) VALUES 
    (1, 1, 'term one', 1), 
    (2, 2, 'term two', 2), 
    (3, 3, 'term three', 3), 
    (4, 4, 'term four', 4), 
    (5, 5, 'term five', 5), 
    (6, 6, 'term six', 6), 
    (7, 7, 'term seven', 7), 
    (8, 8, 'term eight', 8), 
    (9, 9, 'term nine', 9), 
    (10, 10, 'term ten', 10); 
/*!40000 ALTER TABLE `terms` ENABLE KEYS */; 

-- Dumping data for table algo.years: ~15 rows (approximately) 
/*!40000 ALTER TABLE `years` DISABLE KEYS */; 
INSERT IGNORE INTO `years` (`year_id`, `year_name_in_nums`, `year_name_in_text`) VALUES 
    (1, 2000, '2000/2001'), 
    (2, 2001, '2001/2002'), 
    (3, 2002, '2002/2003'), 
    (4, 2003, '2003/2004'), 
    (5, 2004, '2004/2005'), 
    (6, 2005, '2005/2006'), 
    (7, 2006, '2006/2007'), 
    (8, 2007, '2007/2008'), 
    (9, 2008, '2008/2009'), 
    (10, 2009, '2009/2010'), 
    (11, 2010, '2010/2011'), 
    (12, 2011, '2011/2012'), 
    (13, 2012, '2012/2013'), 
    (14, 2013, '2013/2014'), 
    (15, 2014, '2014/2015'); 
/*!40000 ALTER TABLE `years` ENABLE KEYS */; 
/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; 
/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; 
/*!40101 SET [email protected]_CHARACTER_SET_CLIENT */; 
+0

錯誤輸出是什麼? –

+0

'/ * SQL錯誤(1064):您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,在'LEFT JOIN (從INNER JOIN中選擇term_year class_students ON term_year ='在第2行* /' –

+0

')附近使用正確的語法什麼是年份ID?是它的*自己的*編號!?!?! – Strawberry

回答

1

不能使用LEFT JOIN這樣的...你可以使用UNION ALL,但如果這兩個查詢具有相同的列數和相同的數據類型,只會工作,但那麼你將無法區分在兩列之間,因爲它們是一個。嘗試eperate他們是這樣的:

SELECT 
    term_name_in_nums, 
    NULL as term_year 
FROM 
    terms 
    INNER JOIN 
    class_students ON (term_id=cs_term_id) 

UNION ALL 

SELECT 
    NULL as term_name_in_nums, 
    term_year 
FROM 
    terms 
    INNER JOIN 
    class_students ON (term_id=cs_term_id) 

或嘗試做這個查詢:

SELECT 
    terms.term_name_in_nums, 
    terms_b.term_year 
FROM 
    class_students 
    INNER JOIN 
    terms ON (terms.term_id=class_students.cs_term_id) 
    LEFT JOIN 
    terms as terms_b ON (terms_b.term_id=class_students.cs_term_id) 

我沒有表中的數據來測試和你正在試圖讓沒有說清楚。所以無論如何試一試,你可以編輯它以適應你的情況。

根據以上數據,以幫助瞭解什麼OP是後:

SELECT 
    class_students.cs_id, 
    class_students.cs_class_student, 
    class_students.cs_class_id, 
    class_students.cs_term_id, 
    classes.class_name, 
    students.student_names, 
    students.student_telephone_number, 
    terms.term_name_in_nums, 
    terms.term_name_in_text, 
    terms.term_year, 
    years.year_name_in_nums, 
    year_name_in_text 
FROM 
    class_students 
    LEFT JOIN classes ON (class_students.cs_class_id=classes.class_id) 
    LEFT JOIN students ON (class_students.cs_class_student=students.student_id) 
    LEFT JOIN terms ON (class_students.cs_term_id=terms.term_id) 
    LEFT JOIN years ON (terms.term_year=years.year_id) 

這將給所有的班級,學生,任期和年度信息的在class_students表中的所有記錄

輸出爲php數組:

$class_students = array(
    array('cs_id' => '1','cs_class_student' => '1','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => 'aa','student_telephone_number' => '123456','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '2','cs_class_student' => '1','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => 'aa','student_telephone_number' => '123456','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '3','cs_class_student' => '2','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => 'bb','student_telephone_number' => '5576899','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '4','cs_class_student' => '3','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419520','student_telephone_number' => '788399','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '5','cs_class_student' => '4','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419521','student_telephone_number' => '7892020','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '6','cs_class_student' => '5','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419522','student_telephone_number' => '33772','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '7','cs_class_student' => '6','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419523','student_telephone_number' => '86729','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '8','cs_class_student' => '7','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419524','student_telephone_number' => '526890','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '9','cs_class_student' => '8','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419525','student_telephone_number' => '444332','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '10','cs_class_student' => '9','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419526','student_telephone_number' => '937678','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '11','cs_class_student' => '10','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419527','student_telephone_number' => '44','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '12','cs_class_student' => '11','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419528','student_telephone_number' => '774','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '13','cs_class_student' => '12','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419529','student_telephone_number' => '2147483647','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '14','cs_class_student' => '13','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419531','student_telephone_number' => '2147483647','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '15','cs_class_student' => '14','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419533','student_telephone_number' => '2147483647','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001'), 
    array('cs_id' => '16','cs_class_student' => '15','cs_class_id' => '1','cs_term_id' => '1','class_name' => '1','student_names' => '23050359165419535','student_telephone_number' => '353657674','term_name_in_nums' => '1','term_name_in_text' => 'term one','term_year' => '1','year_name_in_nums' => '2000','year_name_in_text' => '2000/2001') 
); 
+1

請參閱edit.I添加數據 –

+0

@ user2420583請參閱編輯答案和新查詢 – amaster

+0

謝謝@ amaster507它工作出色。 –

1

您的查詢不能很好地形成在兩個方面。

第一個括號表達式沒有意義。

在查詢結束時,您似乎將LEFT JOINING此子查詢添加到您的頂級查詢中。但是您沒有爲LEFT JOIN提供ON子句。您確實爲INNER JOIN提供了一個。

 select term_year 
      from terms 
    INNER JOIN class_students ON term_year=cs_term_id 

如果我是你,我會格式化這個查詢像這樣,添加別名所有表(別名是必需的子查詢),並拼出ON子句更好。我已經添加了最後一個ON子句,但是我無法弄清楚你想用它做什麼。

select t.term_name_in_nums, t.term_year 
     from terms AS t 
INNER JOIN class_students AS s ON t.term_id=s.cs_term_id 
LEFT JOIN 
    (
     select term_year 
      from terms 
    INNER JOIN class_students ON term_year=cs_term_id 
    ) AS y ON y.what = what.what 
相關問題