У меня есть этот проект, написанный на java. Я хочу, чтобы эта штука отображала данные из разных таблиц на 1 дисплее.
Вот java-код
static void showPersonality() {
try {
Statement stmt1 = conn.createStatement();
ResultSet rs1 = stmt1.executeQuery("SELECT * FROM faculty JOIN teacher ON faculty.id=teacher.faculty_id JOIN department ON faculty.id=department.faculty_id JOIN course ON department.id=course.department_id");
while (rs1.next()) {
String namaFakultas = rs1.getString("faculty_name");
String namaDosen = rs1.getString("teacher_name");
String namaDepartemen = rs1.getString("department_name");
String namaKursus = rs1.getString("course_name");
System.out.println(String.format("| %s | %s | %s | %s |", namaFakultas, namaDepartemen, namaKursus, namaDosen));
}
} catch (Exception e) {
e.printStackTrace();
}
}
И я также сделал 4 таблицы: факультет, кафедра, преподаватель и курс.
Таблица факультетов (я вставил 1 данные)
CREATE TABLE faculty(
id INT NOT NULL AUTO_INCREMENT,
faculty_name VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
Таблица кафедр (я вставил 2 данных в 1 факультет)
CREATE TABLE `department` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`faculty_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `faculty_id` (`faculty_id`),
CONSTRAINT `department_ibfk_1` FOREIGN KEY (`faculty_id`) REFERENCES `faculty` (`id`)
);
Таблица учителей (я вставил 2 данных в 1 факультет, причем у каждого данных свой отдел)
CREATE TABLE `teacher` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`teacher_name` varchar(255) NOT NULL,
`faculty_id` int(11) NOT NULL,
`department_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `department_id` (`department_id`),
CONSTRAINT `teacher_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `department` (`id`),
KEY `faculty_id` (`faculty_id`),
CONSTRAINT `teacher_ibfk_2` FOREIGN KEY (`faculty_id`) REFERENCES `faculty` (`id`)
);
Таблица курса (я вставил 2 данных, каждая из которых имеет свой отдел)
CREATE TABLE `course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`course_name` varchar(255) NOT NULL,
`department_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `department_id` (`department_id`),
CONSTRAINT `course_ibfk_1` FOREIGN KEY (`department_id`) REFERENCES `department` (`id`)
);
После выполнения кода он показывает 4 данных
| Teknik | Informatika | OOP | Adi Gunawan |
| Teknik | Sistem Informasi | Basis Data | Adi Gunawan |
| Teknik | Informatika | OOP | Ani Wijaya |
| Teknik | Sistem Informasi | Basis Data | Ani Wijaya |
Я ожидал, что он покажет только 2 данных со всеми разными таблицами, кроме таблицы факультетов.
| Teknik | Informatika | OOP | Adi Gunawan |
| Teknik | Sistem Informasi | Basis Data | Ani Wijaya |
Что-то не так с моим java-кодом или, может быть, с моей базой данных?
Я отредактировал свой результат данных и ожидаемые данные. Может быть, что-то не так с моим кодом или моей базой данных?




(Вывод просто показывает список имен, а не идентификаторов. Вы должны показать весь необработанный список данных для правильного ответа)
(догадайтесь, значения имени других 3 таблиц уникальны, но имя таблицы, конечно, не уникально.)
Я думаю, что это просто проблема с данными.
в запросе после выполнения трех передних соединений может быть возвращено 2 строки.
| Teknik | Informatika | OOP
| Teknik | Sistem Informasi | Basis Data
и посмотрите на окончательные результаты после следующего 4-го шага соединения (переупорядоченный вывод)
| Teknik | Informatika | OOP | Adi Gunawan |
| Teknik | Informatika | OOP | Ani Wijaya |
| Teknik | Sistem Informasi | Basis Data | Adi Gunawan |
| Teknik | Sistem Informasi | Basis Data | Ani Wijaya |
как вы видете,
это означает, что каждый OOP и Basis Data соединены с 2 рядами course table
поэтому необработанные данные ожидают:
# rows in course table
... OOP_id | Adi Gunawan
OOP_id | Ani Wijaya
Basis Data_id | Adi Gunawan
Basis Data_id | Ani Wijaya
Если хочешь,
| Teknik | Informatika | OOP | Adi Gunawan |
| Teknik | Sistem Informasi | Basis Data | Ani Wijaya |
on пункт 4-го соединения, может быть, не столбец department_id, это должен быть другой столбец
если у course data есть faculty_id, присоединяйтесь к faculty_id двух столов
после вашего комментария Я обнаружил, что пропустил одну вещь.
teacher таблица имеет две связи
faculty.department.так
в предложении on после присоединения teacher вы должны добавить условие, что teacherdepartment_id = departmentid тоже. не только faculty.id=teacher.faculty_id
запрос должен быть таким
SELECT *
FROM faculty
JOIN department ON faculty.id=department.faculty_id
JOIN teacher ON faculty.id=teacher.faculty_id AND teacher.department_id = department.id
JOIN course ON department.id=course.department_id
Как видите, это не так. Тот факт, что таблица faculty имеет отношение один ко многим с таблицей department и teacher. Но таблица course имеет отношение «один ко многим» к таблице department и отношение «многие к одному» к таблице teacher. Вот это меня смутило
@twyla я пропустил одну вещь. я редактировал содержимое.
Вы должны показать записи, которые присутствуют в базе данных, данные, полученные в результате запроса, и что вы ожидаете