объединение двух таблиц в моем sql не возвращает набор результатов - PullRequest
0 голосов
/ 27 сентября 2018

Привет! Я столкнулся с проблемой при извлечении определенного набора данных с использованием 3 таблиц в базе данных MySql. Вот следующие таблицы:

Student
SID | Name | Age | Telephone

Term
TID | Start | End

Payment
PID | TID | SID | Value

SID - это первичный ключ таблицы Student.TID является первичным ключом таблицы Term.PID является первичным ключом таблицы платежей.TID и SID в таблице платежей являются ссылками на внешний ключ.

Таблица учеников содержит данные учеников.Таблица терминов содержит данные дат начала и окончания срока.Платежная таблица содержит данные о студенческом платеже.Записи в таблице платежей могут содержать TID или нет.Когда это регистрационный платеж, TID не будет.В противном случае это плата за срок, и будет TID.То, что я хочу, - это список студентов, которые до сегодняшнего дня не оплачивали эти условия.Asuume этот TID находится в переменной.Как я могу получить список студентов?ЭТО СЧИТАЕТ СУПЕР ЛЕГКО.Но я не смог найти ответ на этот целый день ?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Попробуйте это:

   select s.name, p.value from Student s, Term t, Payment p where t.TID = p.TID and s.SID=p.SID and p.TID is null; 
0 голосов
/ 27 сентября 2018

Вам нужен список только тех студентов, у которых нет TID-заполненной записи, чьи даты начала и окончания совпадают с сегодняшней, в Оплате

SELECT * FROM
  student
  LEFT OUTER JOIN
  (select * from payment where TID is not null and NOW() BETWEEN start and end) this_term_payments
  on student.id = this_term_payments.sid
WHERE
  this_term_payments.ID is null

Есть много способов снять шкуру с этой кошки,Вот один.Мы отфильтровываем таблицу платежей до списка платежей этого термина (это внутренний запрос).И оставил присоединиться к этому студентам.Соединение влево означает, что мы получаем всех студентов, сопоставленных с this_term_payments, если строка this_term_payments существует, или NULL в каждом столбце this_term_payments, если термин платеж не существует.Затем предложение where фильтрует все результаты, установленные как «только те, у кого нет срочного платежа», ища те нули, которые создает левое объединение

FWIW, ваш вопрос привлек близкие голоса, потому что он неt включают примеры данных / демонстрируют уровень ваших усилий, которые мы хотели бы видеть в вопросах SQL.Если вы включили образцы данных для всех ваших таблиц и примерный набор результатов, который вы хотели увидеть, это означает, что мы можем написать точный запрос, который соответствует вашим требованиям.

Это немного обоюдоострый меч для меня;мы можем доставить именно то, о чем вы просите, даже если позже вы поймете, что это не то, что вам нужно (спрашивать по-английски гораздо более расплывчато, чем приводить примерный набор результатов), но в то же время мы в основном становимся неким сторонним подрядчиком по выполнению домашних заданий или подобным образомваша работа для вас и устранение возможностей для обучения на этом пути.Надеюсь, вы возьмете этот запрос (скорее всего, он не выводит все, что вы хотите, или выводит то, что вам не нужно) и создаст из него то, что вы хотите, теперь, когда методика была объяснена ..:)

Для вопроса SQL, который был относительно хорошо получен (к тому времени, когда я закончил редактировать его, следуя комментариям), и привлек несколько отличных ответов, посмотрите здесь:

Заполнитепробелы в данных, используя значение, пропорциональное расстоянию пробела до данных из окружающих строк?

Это больше, как вам нужно задавать вопросы SQL - говорите, что вы хотите, приводите примеры данных, дайте сценариичтобы помочь людям создавать ваши одни и те же данные, чтобы они могли поиграть со своей идеей, не скучая при создании данных.Я выбрал тот, потому что у меня даже не было попыток показать SQL в то время;это было просто мысленное упражнение.Отсутствие работы не обязательно является препятствием для постановки хорошего вопроса

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