MySQL — проверка значений PHP в одном запросе против другого

По сути, я пытаюсь выполнить два запроса: один — чтобы получить требования к той или иной программе (или основной), а другой — чтобы получить информацию о курсах, пройденных студентом.

Я хочу сравнить возвращаемые строки друг с другом, и, если пользователь прошел требуемый курс, поставьте «флажок» рядом с возвращенным требованием. Если они не прошли требуемый курс, поместите пустое поле рядом с требованием.

Я почти понял, где работает концепция флажка, однако, когда я использую два цикла while, он дублирует возвращаемые требования (курсы).

Когда я использую один цикл while, он извлекает данные по второму запросу и возвращает все требования, но просто прекращает проверку после того, как найдет свое первое совпадение (например, не переходит к просмотру, пройдены ли курсы 2, 3 или 4, и т. Д. ).

Я также попробовал функцию strcmp, чтобы сравнить $ studentubject с $ Programsubject (то же самое для programnumber и studentnumber).

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

         <table class="table">
<tr>
<th>&nbsp;</th>
<th>Class</th>
<th>Term</th>
<th>Credits</th>
</tr><?php

$q = $db->query("SELECT * FROM `program_courses` a, `programs` b, `user_details` c WHERE a.pid = b.pid AND c.uid = '".$_GET['id']."' AND c.major = b.major");while($program = $q->fetch()) {

$w = $db->query("SELECT * FROM `user_courses` WHERE uid = '".$_GET['id']."'");

$student = $w->fetch(); { // have also tried using a while loop here$programsubject=$program['subject'];
$programnumber=$program['number'];$studentsubject=$student['subject'];
$studentnumber=$student['number'];?><?phpif ($studentsubject==$programsubject && $studentnumber==$programnumber) {

$checkbox = 'src="http://www.clipartbest.com/cliparts/ncX/jL6/ncXjL6rcB.png" width="25px" height="25px"';} elseif ($studentsubject!=$programsubject || $studentnumber!=$programnumber) {$checkbox = 'src="http://www.clker.com/cliparts/e/q/p/N/s/G/checkbox-unchecked.svg" width="25px" height="25px"';

}

?><?php

//check off the requirement if the student has completed the courseecho '
<tr style="background-color:#E9FFD2">
<td> <img '.$checkbox.'> </td>
<td>'.$programsubject.' '.$programnumber.'</td>
<td>&nbsp;</td>
<td>3</td></tr>';?><?php

//End our conditionals

}

}

?>
</table>

РЕДАКТИРОВАТЬ: Дополнительная информация, включая структуру таблицы для этих соответствующих таблиц.

Я надеялся избежать изменения двух соответствующих запросов, но вот дамп того, что каждый возвращает. Моя причина для того, чтобы хранить данные раздельно, заключается в том, что в будущем могут быть введены более сложные условия (например, могут учитываться курсы с минимальной оценкой или только курсы с точным количеством полученных кредитов и т. Д.).

Для пользователя 1001 следующее будет дамп для …

SELECT *
FROM `program_courses` a, `programs` b, `user_details` c
WHERE a.pid = b.pid AND c.uid = '1001' AND c.major = b.major

id, pid, subject, number, credits, pid, major, title, degree, college, catalog, credits_req, id, uid, major, college, degree, catalog_year, credits, gpa, academic_standing, advisor, holds, id
'3','1','IDT','600','3','1','4574','Instructional Design & Technology','PHD','45','201408','72','1','1001','4574','45','Doctor of Philosophy','201408','52','3.44','Good Standing','Terence A','01'
'4','1','IDT','610','3','1','4574','Instructional Design & Technology','PHD','45','201408','72','1','1001','4574','45','Doctor of Philosophy','201408','52','3.44','Good Standing','Terence A','01'
'5','1','IDT','693J','3','1','4574','Instructional Design & Technology','PHD','45','201408','72','1','1001','4574','45','Doctor of Philosophy','201408','52','3.44','Good Standing','Terence A','01'
'6','1','IDT','750','3','1','4574','Instructional Design & Technology','PHD','45','201408','72','1','1001','4574','45','Doctor of Philosophy','201408','52','3.44','Good Standing','Terence A','01'
'7','1','IDT','790','3','1','4574','Instructional Design & Technology','PHD','45','201408','72','1','1001','4574','45','Doctor of Philosophy','201408','52','3.44','Good Standing','Terence A','01'
'8','1','IDT','691','3','1','4574','Instructional Design & Technology','PHD','45','201408','72','1','1001','4574','45','Doctor of Philosophy','201408','52','3.44','Good Standing','Terence A','01'
'21','1','IDT','931','3','1','4574','Instructional Design & Technology','PHD','45','201408','72','1','1001','4574','45','Doctor of Philosophy','201408','52','3.44','Good Standing','Terence A','01'
'22','1','IDT','660','3','1','4574','Instructional Design & Technology','PHD','45','201408','72','1','1001','4574','45','Doctor of Philosophy','201408','52','3.44','Good Standing','Terence A','01'

Для того же пользователя с ..

SELECT * FROM `user_courses` WHERE id = '1001'

id, cid, uid, subject, number, credits, enroll_status, id, id
'1', '1', '1001', 'IDT', '610', '3', 'complete'
'3', '86903', '1001', 'IDT', '750', '3', 'complete'

Таким образом, в соответствии с моей базовой логикой, которая заключается только в том, что имя субъекта и номер совпадают между таблицами user_courses и program_courses, у IDT 610 и IDT 750 должен быть установлен флажок для завершения, а для всех других требований программы потребуется пустой флажок. Имеет ли это смысл? Я действительно ценю все отзывы, так как я не гуру, когда дело доходит до лучших практик. Я хотел бы вернуться к запросу, если будет представлена ​​соответствующая версия JOIN с вышеуказанной структурой

1

Решение

Отредактировано с вашей структурой таблицы:

SELECT a.subject, a.number, a.credits as course_credits,
b.major, b.title, b.degree,
c.catalog_year,
d.credits as credits_earned
FROM program_courses a
join programs b on a.pid = b.pid
join user_details c on c.major = b.major and c.uid = '".$_GET['id']."'
left join user_courses d on a.pid = d.cid -- not sure that cid from table d is a match to pid in table a, adjust this as appropriate

subject|number|course_credits| major|title|degree|catalog_year|credits_earned
-------|------|--------------|------|-----|------|------------|--------------
IDT |600 |3 |Doctor|ID&T |PHD |2015 |{NULL}
IDT |610 |3 |Doctor|ID&T |PHD |2015 |2.75

-- Courses that the student has taken will have a value for credits_earned and you can base your display logic off of that

Тогда в вашей логике сделайте что-то вроде

if($results['credits_earned'] > 1.5){ // or whatever threshhold is considered passing
// Yes, this student has completed this course
}else{
// Has not completed
}

Я столкнулся с проблемами при выполнении второго запроса в середине цикла выборки из первого запроса. Если вы действительно не хотите объединять два запроса в один, то, возможно, вы могли бы изменить свою логику следующим образом:

// store info on all the courses this student has already taken
$completed_courses = array();
$w = $db->query("SELECT * FROM user_courses ГДЕ uid = '". $ _ GET [' id ']."' ");
while ($ student = $ w-> fetch ()) {
$ Completed_courses [] = $ студент [ 'предмет'] $ студент [ 'номер'].
}

// цикл по всем необходимым курсам
$ q = $ db-> query ("SELECT * FROM program_courses а, programs б, user_details c ГДЕ a.pid = b.pid AND c.uid = '". $ _ GET [' id ']."' AND c.major = b.major ");
while ($ program = $ q-> fetch ()) {

if(in_array($program['subject'].$program['number'], $completed_courses)){
// Yes the student has completed this course
}else{
// no, the student has not completed this course
}

}

?>
[/ NOEDIT]

3

Другие решения

Пожалуйста, смотрите ответ Дрю выше. Помещая курсы, взятые в массив, вначале, а затем перебирая необходимые курсы (в противоположность тому, что я пробовал), цикл while не проблематичен, и это на самом деле работает как шарм. Слава вам, сэр. Дрю, и я ценю прекрасное решение и возможное решение, которое вы предоставили. Если бы у меня было больше репутации, я бы проголосовал!

0

По вопросам рекламы [email protected]