php - php/moodle中Mysql查询分组结果

标签 php mysql moodle

我有一个 mysql 查询:

SELECT
mdl_user_info_data.data,
mdl_user.firstname, 
mdl_user.lastname, 
mdl_grade_grades.itemid, 
mdl_grade_items.itemname,
mdl_course.cpd,
mdl_grade_grades.timecreated AS DATE
FROM mdl_user
INNER JOIN mdl_grade_grades ON mdl_user.id = mdl_grade_grades.userid
INNER JOIN mdl_grade_items ON mdl_grade_grades.itemid = mdl_grade_items.courseid
INNER JOIN mdl_course ON mdl_grade_items.courseid = mdl_course.id
INNER JOIN mdl_user_info_data ON mdl_user.id = mdl_user_info_data.userid
WHERE mdl_grade_grades.timecreated >= '1370091991'
AND mdl_grade_grades.timecreated <= '1370524243'
AND mdl_user_info_data.fieldid = 1

查询正确执行,并且在 phpmyadmin 中正确显示。有4条记录。 其中一些记录具有相同的用户名,例如:

09118514    Elazabi Gillyman    108 Career Management1  1370508988
09118514    Elzaabi Gillyman    108 Career Management2  1370508988
03228812    Magria  Martinia    171 NULL    4           1370294859
03228812    Magria  Martinia    171 Making Budgeting    1370294859

但是当我尝试在 php 中使用它时,只有 2 条记录:

09118514    Elazabi Gillyman    108 Career Management2  1370508988
03228812    Magria  Martinia    171 Making Budgeting    1370294859

我假设具有相同 id 的记录以某种方式被分组,但我需要查看所有结果。我做错了什么?

这是确切的查询:

$sql = "SELECT
        mdl_user_info_data.data,
        mdl_user.firstname, 
        mdl_user.lastname, 
        mdl_grade_grades.itemid, 
        mdl_grade_items.itemname,
        mdl_course.cpd,
        mdl_grade_grades.timecreated AS DATE
        FROM mdl_user
        INNER JOIN mdl_grade_grades ON mdl_user.id = mdl_grade_grades.userid
        INNER JOIN mdl_grade_items ON mdl_grade_grades.itemid = mdl_grade_items.courseid
        INNER JOIN mdl_course ON mdl_grade_items.courseid = mdl_course.id
        INNER JOIN mdl_user_info_data ON mdl_user.id = mdl_user_info_data.userid
        WHERE mdl_grade_grades.timecreated >= '1370091991'
        AND mdl_grade_grades.timecreated <= '1370524243'
        AND mdl_user_info_data.fieldid = 1";

$users = $DB->get_records_sql($sql);
var_dump($users);

var_dump 是这个结果的五倍(请注意,为了便于阅读,我编辑了一些字段):

array(5) { 
  [20038617]=> object(stdClass)#387 (7) { ["data"]=> string(8) "20038617" ["firstname"]=> string(9) "Bhekumuzi" ["lastname"]=> string(7) "Shongwe" ["itemid"]=> string(2) "72" ["itemname"]=> string(21) "Delegating Assessment" ["cpd"]=> string(4) "2.00" ["date"]=> string(10) "1370518594" } 

["03429262"]=> object(stdClass)#388 (7) { ["data"]=> string(8) "03429262" ["firstname"]=> string(7) "Shirlee" ["lastname"]=> string(5) "Levey" ["itemid"]=> string(3) "100" ["itemname"]=> string(27) "The IFRS Agenda part 2 quiz" ["cpd"]=> string(4) "0.25" ["date"]=> string(10) "1370431311" } 

[10001873]=> object(stdClass)#386 (7) { ["data"]=> string(8) "10001873" ["firstname"]=> string(6) "Bertha" ["lastname"]=> string(11) "Muchineripi" ["itemid"]=> string(3) "103" ["itemname"]=> string(45) "State of the nation analysis 2012 part 3 quiz" ["cpd"]=> string(4) "0.25" ["date"]=> string(10) "1370255012" } 

["09118514"]=> object(stdClass)#385 (7) { ["data"]=> string(8) "09118514" ["firstname"]=> string(6) "Elzabi" ["lastname"]=> string(7) "Gillman" ["itemid"]=> string(3) "108" ["itemname"]=> string(17) "Career Management" ["cpd"]=> string(4) "2.00" ["date"]=> string(10) "1370508988" } 

["03228812"]=> object(stdClass)#383 (7) { ["data"]=> string(8) "03228812" ["firstname"]=> string(5) "Maria" ["lastname"]=> string(6) "Martin" ["itemid"]=> string(3) "172" ["itemname"]=> string(90) "Managerial Megatrends and Financial Control Quiz - pass the quiz for automatic CPD logging" ["cpd"]=> string(1) "4" ["date"]=> string(10) "1370297204" } }

最佳答案

Moodle 文档位于 http://docs.moodle.org/dev/Data_manipulation_API#Getting_an_hashed_array_of_records表示您正在使用的 API 调用 (get_records_sql) 检索由查询的第一列索引的记录的哈希数组。文档说

The array is indexed by the first column of the fields returned by the query. Thus to assure consistent data, it appears to be best practice to ensure that your query include an "id column" as the first field.

“似乎是最佳实践?”呵呵。这是轻描淡写的典范。

因此,对于查询结果中 mdl_user_info_data.data 的每个不同值,您都会在哈希数组中获取一项。 moodle get_records_sql 方法按照其设计的方式运行。

Moodle 还提供记录集 API。这就是你想要的。 http://docs.moodle.org/dev/Data_manipulation_API#Using_Recordsets

尝试这样的事情。

$recordset = $DB->get_recordset_sql($sql);
foreach ($recordset as $user) {
    // Do whatever you want with this user's record
}
$recordset ->close(); // Don't forget to close the recordset!

关于php - php/moodle中Mysql查询分组结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17022012/

相关文章:

php - 在PHP中如何使用md5()的raw_output返回值?

php - $ 与最后一个字符换行符之前的位置不匹配

php - mysql版本更新中Moodle配置错误

php - Moodle - 获取当前用户角色

php - Laravel 4 查询

javascript - 安装后 Moodle 3.7 无法正确加载

php - 如何在 Laravel 5.3 中显示存储文件夹中的图像?

PHP:收集传递给函数的所有变量作为数组?

sql - 编写此查询的最佳方式

在配置文件中添加 lower_case_table_names=2 后,mysql 8.0 无法启动