我正在为Moodle 3.2用PHP编写一个块,但是SQL不起作用有点困难。
基本上,我想得到所有用户的测验分数。
我的SQL在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

正如我在MySQL中所说:
php - Moodle复杂的SQL无法正常工作-LMLPHP
但是这里是Moodle中的PHP代码:
$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);

它只生成两个记录,其中测验id也是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 ) )

我不清楚自己哪里出了问题,但也不清楚为什么会有两个不同的结果
欣然接受任何建议,
非常感谢
戴夫

最佳答案

当您使用任何Moodle$DB->get_records*函数时,结果将作为数组返回,并由检索到的第一个字段索引。
因此,在本例中,数组将由userid索引-因此只有2条记录,因为只有2个不同的用户id。
如果要使用$DB->get_records*函数,必须确保第一个字段是唯一的(例如'qg.id')。
或者,可以使用$DB->get_recordset_sql(),这样就可以遍历结果,而不必担心重复的id。
在您编写更多Moodle代码之前,请打开developer debugging,因为在这种情况下,这会给您一条警告消息。

关于php - Moodle复杂的SQL无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43683289/

10-16 09:21