Запросы на присоединение не работают должным образом при попытке сравнить результат подсчета со значением - PullRequest
0 голосов
/ 29 января 2019

Я учусь SQL из книги и пытаюсь выполнить некоторые упражнения на join queries. Единственная проблема, с которой я сталкиваюсь, заключается в том, что все мои соединения queries не работают, пока они кажутсяну

students(student_id,student_names,student_age)
courses_students(course_id,student_id)
courses(course_id,course_schedule,course_room,teacher_id)
teachers(teacher_id,teacher_names)

Вопрос: «На какие курсы поступило более 5 студентов?»

Вот что я сделал:

SELECT course_name,
       count
  (SELECT count(*)
   FROM courses) AS COUNT
FROM students,
     courses,
     courses_students
WHERE students.student_id=courses_students.student_id,
      courses.course_id=courses_students.course_id
  AND COUNT > 5

И другиеВо-первых, каковы имена студентов, обучающихся как минимум на 2 курсах, запланированных на те же часы

Мой запрос:

SELECT student_name,
       schedule
FROM students,
     courses,
     courses_students
WHERE students.student_id=courses_students.student_id,
      courses.course_id=courses_students.course_id
  AND COUNT > 2

Ответы [ 4 ]

0 голосов
/ 29 января 2019

Вам нужно агрегировать по курсу, а затем определить количество студентов:

SELECT
    c.course_name,
    COUNT(*) AS cnt
FROM courses c
INNER JOIN courses_students cs
    ON c.course_id = cs.course_id
INNER JOIN students s
    ON cs.student_id = s.student_id
GROUP BY
    c.course_name
HAVING
    COUNT(*) > 5;
0 голосов
/ 29 января 2019

stackoverflow на самом деле не сайт для выполнения домашней работы, но, как вы уже попытались решить задачу, вот решение для вопроса номер один:

      SELECT cs.course_id
        FROM courses_students cs
  INNER JOIN students s
          ON cs.course_id = s.course_id
    GROUP BY cs.course_id
      HAVING count(*) > 5

Читайте о GROUP BYи HAVING предложение - хороший способ решить некоторые проблемы.

Вопрос № 2 можно решить так:

      SELECT student_names
        FROM students s 
  INNER JOIN courses_students cs
          ON cs.student_id = s.student_id
  INNER JOIN (    
              SELECT course_id
                FROM courses c
            GROUP BY course_schedule
              HAVING count(*) > 1
             ) sub
             ON sub.course_id = cs.course_id

INNER JOIN с подзапросом выбирает курсы, которые запланированыв то же время (с тем же курсом_планирования).Поскольку другие таблицы «связаны» с INNER JOIN s, у нас, наконец, будет только набор студентов, которые посещают один из этих курсов.

0 голосов
/ 29 января 2019

В MySQL вы должны явно указать joins.В отличие от Oracle он не может обрабатывать объединения со знаком =.

SELECT course_name,
       count
  (SELECT count(*)
   FROM courses) AS COUNT
FROM students 
     INNER JOIN courses  on courses.course_id=courses_students.course_id
     INNER JOIN courses_students  on students.student_id=courses_students.student_id
WHERE  COUNT(*) > 2
0 голосов
/ 29 января 2019

В этом внутреннем запросе:

(SELECT count(*)
  FROM courses) AS COUNT

вам необходимо сузить то, что входит в COUNT.Как есть, он выбирает все элементы в таблице courses.Внутренний запрос не знает об ограничениях во внешнем запросе.Попробуйте добавить предложение where во внутренний запрос.Вам может понадобиться добавить псевдонимы таблиц, чтобы однозначно ссылаться на правильную таблицу courses, поэтому нет никакой двусмысленности, ссылается ли она на таблицу courses во внутреннем запросе или во внешнем запросе.

И,как отмечалось в других ответах, это не лучший способ структурировать объединения.

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