Возникли проблемы с логикой команд SQL — пожалуйста, помогите

#php #mysql

#php #mysql

Вопрос:

Я использую следующую инструкцию для заполнения электронной таблицы Excel информацией об учащемся, включая «фактические часы обучения».

Проблема в том, что я хочу показать всем студентам, для которых tblstudentstatus.id = 3, но мне также нужно показать фактические часы обучения для этих студентов. К сожалению, не у всех студентов есть соответствующая запись в «viewactualstudenthours». Это утверждение полностью исключает тех студентов, для которых нет соответствующей записи в «viewatualstudenthours».

Как мне заставить всех студентов отображаться там, где tblstudentstatus.id = 3?

Если для них нет записи в viewactualstudenthours, это не должно полностью исключать учащегося…поля учебных часов должны быть просто пустыми. Мы были бы очень признательны за вашу помощь.

 $result=mysqli_query($dbc,"SELECT tblstudent.first, tblstudent.last,
            LEFT(viewactualstudenthours.ACTUAL_remain,5),
            (SELECT first from tbladdress where tbladdress.id = tblstudent.contact2),
            (SELECT last  from tbladdress where tbladdress.id = tblstudent.contact2),
            tbladdress.address1,tbladdress.city,tbladdress.state,tbladdress.zip1,
            tbladdress.phone, tbladdress.cell, tbladdress.email
            FROM tblstudent, tbladdress, tblstudentstatus, viewactualstudenthours
            WHERE viewactualstudenthours.student_id = tblstudent.id
              AND tblstudent.status = tblstudentstatus.id
              AND tbladdress.id = tblstudent.contact1
              AND tblstudentstatus.id = 3");
  

(Примечание: редактор сделал SQL получитаемым, но, вероятно, нарушил все правила в сборнике кода PHP.)

Комментарии:

1. Обратите внимание, что вы можете форматировать строки как код с отступом в четыре пробела. Кнопка «{}» на панели инструментов редактора сделает это за вас. Отредактируйте свой вопрос и попробуйте его. Нажмите на оранжевый знак вопроса на панели инструментов редактора для получения дополнительной информации и советов по форматированию.

2. @junkyjunk: нет, это не так. Я предполагаю, что ваше имя пользователя ‘junkyjunk’ и тот факт, что вы зарегистрировались сегодня, могут заставить людей подумать, что вы занимаетесь троллингом. Для вашей ссылки: msmvps.com/blogs/jon_skeet/archive/2010/08/29 /…

3. меньше жалоб и поиск ответа @junkyjunk

Ответ №1:

Научитесь использовать явное обозначение join, введенное в SQL-92, вместо старого списка имен таблиц, разделенных запятыми, в предложении FROM.

Вам нужно использовать ЛЕВОЕ ВНЕШНЕЕ соединение таблицы tblstudent с представлением viewactualstudenthours . Игнорируя кавычки и т.д., Необходимые для работы кода на PHP, вам нужно:

 SELECT S.first, S.last,
       H.ACTUAL_remain,
       A2.first, A2.last,
       A1.address1, A1.city, A1.state, A1.zip1,
       A1.phone,    A1.cell, A1.email
  FROM tblstudent                  AS S
  JOIN tbladdress                  AS A1 ON S.Contact1 = A1.ID
  JOIN tbladdress                  AS A2 ON S.Contact2 = A2.ID
  JOIN tblstudentstatus            AS T  ON S.Status   = T.ID
  LEFT JOIN viewactualstudenthours AS H  ON S.ID       = H.Student_ID
 WHERE T.id = 3
  

Также научитесь использовать псевдонимы таблиц (предложения AS) — это упрощает и проясняет SQL. И если схема зависит от вас, не добавляйте в имена таблиц ‘tbl’, а в имена представлений ‘view’ — это просто слишком много беспорядка.

Обратите внимание, что я избавился от вложенных выборов в списке выбора, дважды присоединившись к таблице адресов с двумя отдельными псевдонимами. Я удалил функцию LEFT (); вы можете повторно ввести ее, если вам нужно.

Комментарии:

1. Кажется, это работает отлично. Я также сообщу завтра, если возникнут какие-либо проблемы. Я просто хочу сказать вам спасибо. Если бы таких людей, как вы, не существовало, я бы ничего не знал. Видеть конкретный практический пример, преобразованный подобным образом, намного полезнее и эффективнее для меня, чем читать учебники и примеры других людей. Я думаю, что понимаю предложения AS, и я также начинаю понимать JOIN и LEFT JOIN. Еще раз спасибо за вашу помощь.