Выберите три разные вещи из трех разных таблиц - PullRequest
1 голос
/ 01 апреля 2019

Я хочу запросить, чтобы получить имя и фамилию учеников и учителей, у которых больше всего курсов с количеством этих курсов.

Стол ученик:

CREATE TABLE Student(
id    INT    AUTO_INCREMENT,
first_name    VARCHAR(255)    NOT NULL,
last_name    VARCHAR(255),
email    VARCHAR(255)    UNIQUE,
PRIMARY KEY (id)
);

Настольный преподаватель:

CREATE TABLE Teacher(
id    INT    AUTO_INCREMENT,
first_name    VARCHAR(255)    NOT NULL,
last_name    VARCHAR(255),
email    VARCHAR(255)    UNIQUE,
degree    VARCHAR(10)    NUT NULL,    
PRIMARY KEY (id)
);

Настольный курс:

CREATE TABLE Course(
id    INT    AUTO_INCREMENT,
code    INT    NOT NULL UNIQUE, 
name    VARCHAR(255)    NOT NULL,
st_id    INT,
teach_id    INT,
PRIMARY KEY (id),
FOREIGN KEY st_id REFERENCES Student (id),
FOREIGN KEY teach_id REFERENCES Teacher (id)
);

Правильно ли приведенный ниже запрос? я могу использовать 3 SELECT в запросе?

Query1:

SELECT      S.first_name
FROM        Student AS S
INNER JOIN  Course AS C
        ON  C.st_id = S.id
SELECT      T.first_name        
FROM        Teacher AS T
INNER JOIN  Course AS CC
        ON  CC.teach_id = T.id
SELECT      COUNT(*)
FROM        Course
WHERE       Course.st_id = S.id
AND         Course.teach_id = T.id
GROUP BY    COUNT(*)
ORDER BY   DESC;

Query2:

SELECT     S.first_name, T.first_name, COUNT(*)
FROM       Student AS S, Teacher AS T, Course
WHERE      Course.st_id = S.id
AND        Course.teach_id = T.id
GROUP BY   COUNT(*)
ORDER BY   DESC;

Если приведенные выше вопросы неверны (вероятно, первый неправильный), направьте меня к правильному ответу, пожалуйста.

ПРИМЕЧАНИЕ: Если порядок не уникален, сначала заказывайте по имени учителя, затем заказывайте по имени ученика (для ясности, но для меня это не так важно).

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Ваш второй запрос ближе к правильности, но у него есть некоторые проблемы.Я бы рекомендовал использовать операторы JOIN, а не подразумеваемые объединения.Это облегчает чтение запроса.

Что-то вроде этого должно работать:

  SELECT t.first_name,
         t.id,
         s.first_name,
         s.id,
         COUNT(*) AS course_count
    FROM Course c
    JOIN Student s ON c.st_id = s.id
    JOIN Teacher t ON c.teach_id = t.id
GROUP BY t.id, s.id
ORDER BY course_count DESC, t.first_name, s.first_name;

Вам нужно добавить группу для того, чтобы рассчитать количество на учащегося.Размещение группы в столбцах идентификаторов, а не в имени, гарантирует, что вы получите учет уникальных учеников и учителей, если в вашей таблице несколько записей с одинаковыми именами.Я также добавляю столбцы идентификаторов в select по той же причине, но они не являются необходимыми и могут быть удалены без ущерба для точности запроса.

0 голосов
/ 01 апреля 2019
SELECT t.first_name, t.id, s.first_name, s.id, COUNT(c.id) AS course_count
  FROM course c
  JOIN student s ON c.st_id = s.id
  JOIN teacher t ON c.teach_id = t.id
 GROUP BY t.id, s.id
 ORDER BY t.first_name, s.first_name

Основные данные содержатся в таблице курсов, а таблицы учеников и учителей требуются только для сбора имен. Этот запрос объединяет три рассматриваемые таблицы, вычисляя количество курсов, разделенных преподавателями и студентами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...