Почему мой sql statment возвращает один и тот же вывод несколько раз - PullRequest
1 голос
/ 08 июня 2019

Ад всем.

Я сделал SQL-отчет, который возвращает мне имя учителя, время, которое он должен посетить, и какой класс он проводит.Мое утверждение возвращает то, что я ожидаю, но оно возвращает один и тот же ответ несколько раз, почему это так?Я не совсем понимаю, что это такое.

Вот мое утверждение

SELECT
`profile`.`name`,
`profile`.nachname,
unterichts_zeit.zeit,
unterichts_typ.typ
FROM
unterichts_zeit
INNER JOIN `profile` ON unterichts_zeit.lehrer = `profile`.id ,
unterichts_typ

И мой вывод

teacher1    teacher1    9:35    klavier
teacher2    teacher2    10:35   klavier
teacher1    teacher1    9:35    gittare
teacher2    teacher2    10:35   gittare
teacher1    teacher1    9:35    generell
teacher2    teacher2    10:35   generell
teacher1    teacher1    9:35    schlagzeug
teacher2    teacher2    10:35   schlagzeug
teacher1    teacher1    9:35    trombone
teacher2    teacher2    10:35   trombone
teacher1    teacher1    9:35    generell
teacher2    teacher2    10:35   generell

Видя это сейчас, он также действительно не отображает то, что я хочу... он отображает каждый тип класса, который не является правильным obv ... черт

, если у кого-то есть идея, как я могу решить эту проблему

спасибо

1 Ответ

4 голосов
/ 08 июня 2019

Вы смешали стили соединения и создали декартово произведение.Декартово произведение - это то, где число строк растет, потому что несвязанные строки соединяются вместе.Иногда это полезно, но обычно это не то, что требуется

В самом конце вашего оператора sql у вас есть запятая, а затем другое имя таблицы

База данных уже взяла на себя работусделал с INNER JOINed парой таблиц и затем просто соединил каждую строку из них с каждой строкой из этой таблицы

Если вы собираетесь объединить 3 таблицы вместе, используйте другой оператор внутреннего соединения

SELECT
`profile`.`name`,
`profile`.nachname,
unterichts_zeit.zeit,
unterichts_typ.typ
FROM
unterichts_zeit
INNER JOIN `profile` ON unterichts_zeit.lehrer = `profile`.id
INNER JOIN unterichts_typ ON <<fill-this-on-clause-out>>

В старые времена мы объединяли таблицы следующим образом:

SELECT *
FROM a, b, c
WHERE a.id = b.id AND b.id = c.id

Если вы не включите предложение WHERE, db будет просто выводить каждую комбинацию строк.Если бы A содержал 1 и 2, а B содержал «x» и «y», а c содержал true и false, вы бы получили:

1,x,true
1,x,false
1,y,true
1,y,false
2,x,true
2,x,false
2,y,true
2,y,false

Теперь современный эквивалент состоит в использовании INNER JOIN, и это оченьсложнее забыть предложение ON (эквивалент старого способа с использованием предложения where), потому что это синтаксическая ошибка.Но БД все еще допускает старый способ и даже позволяет смешивать.Ваше утверждение, имеющее «запятую» в конце, является смешанным стилем соединения, старым способом создания декартового произведения (пункт забытого где)

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