Estoy escribiendo un bloque en PHP para Moodle 3.2 y tengo algunas dificultades con el SQL que no funciona.
Básicamente, quiero obtener los puntajes de las pruebas para todos los usuarios en un curso para todas las pruebas.
Mi SQL funciona en phpMyAdmin
SELECT u.id, u.firstname, u.lastname, qg.quiz, qg.grade, q.grade as maxgrade, q.name FROM mdl_quiz_grades qg JOIN mdl_user u ON u.id = qg.userid JOIN mdl_quiz q ON q.id = qg.quiz WHERE q.course = 2 Como digo esto trabajando en MySQL: 
Sin embargo aquí está el código PHP en Moodle:
$sql = " SELECT u.id, u.firstname, u.lastname, qg.quiz, qg.grade, q.grade AS maxgrade, q.name FROM {quiz_grades} qg JOIN {user} u ON u.id = qg.userid JOIN {quiz} q ON q.id = qg.quiz WHERE q.course = ?"; $params = array($COURSE->id);**//NB Course ID is 2** $records = $DB->get_records_sql($sql, $params); print_r($records);Lo que produce solo los dos registros donde el id de QUIZ también es 2.
Array ( [5] => stdClass Object ( [id] => 5 [firstname] => Bart [lastname] => Simpson [quiz] => 2 [grade] => 5.00000 [maxgrade] => 10.00000 [name] => Quiz 2 ) [6] => stdClass Object ( [id] => 6 [firstname] => Lisa [lastname] => Simpson [quiz] => 2 [grade] => 5.00000 [maxgrade] => 10.00000 [name] => Quiz 2 ) )No tengo claro dónde me equivoqué, pero también por qué obtengo dos resultados diferentes
Cualquier consejo recibido con alegría,
Muchas gracias
dave
Cuando utiliza cualquiera de las funciones $DB->get_records* de Moodle, los resultados se devuelven como una matriz, indexada por el primer campo recuperado .
Entonces, en este caso, la matriz será indexada por el ID de usuario, por lo que solo habrá 2 registros, ya que solo hay 2 ID de usuario diferentes.
Si desea utilizar las funciones $DB->get_records*, deberá asegurarse de que el primer campo sea único (p. ej., 'qg.id').
Alternativamente, puede usar $DB->get_recordset_sql(), que luego le permitirá iterar a través de los resultados, sin preocuparse por las identificaciones duplicadas.
Antes de escribir más código de Moodle, active la depuración del desarrollador , ya que eso le habría dado un mensaje de advertencia en esta situación.