#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. Еще раз спасибо за вашу помощь.