4 таблицы Присоединяйтесь и покажите их в Java MySQL

У меня есть этот проект, написанный на 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-кодом или, может быть, с моей базой данных?

Вы должны показать записи, которые присутствуют в базе данных, данные, полученные в результате запроса, и что вы ожидаете

Davide Lorenzo MARINO 31.03.2022 16:59

Я отредактировал свой результат данных и ожидаемые данные. Может быть, что-то не так с моим кодом или моей базой данных?

twyla 01.04.2022 05:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

(Вывод просто показывает список имен, а не идентификаторов. Вы должны показать весь необработанный список данных для правильного ответа)


(догадайтесь, значения имени других 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 01.04.2022 07:17

@twyla я пропустил одну вещь. я редактировал содержимое.

fver1004 01.04.2022 08:50

Другие вопросы по теме