Moodle:用于列出所有用户的SQL(使用自定义用户配置文件字段)

时间:2014-03-05 10:11:45

标签: sql database moodle

我一直在寻找合适的SQL查询来检索角色为student的所有用户的详细信息。该信息将包括一些自定义用户配置文件字段的数据。

例如,我创建了2个用户个人资料字段,其中包含短名称DepartmentPositionRank。我已设法使用以下SQL检索列表:

SELECT DISTINCT u.id AS userid, department_data.data AS department, rank_data.data AS rank    
FROM mdl_user u
JOIN mdl_role_assignments ra ON ra.userid = u.id
JOIN mdl_role r ON r.id = ra.roleid AND r.shortname =  'student'    
JOIN mdl_user_info_data department_data ON department_data.userid = u.id
JOIN mdl_user_info_field department_field ON department_data.fieldid = department_field.id AND department_field.shortname = 'Department'    
JOIN mdl_user_info_data rank_data ON rank_data.userid = u.id
JOIN mdl_user_info_field rank_field ON rank_data.fieldid = rank_field.id AND rank_field.shortname = 'PositionRank'

但我觉得应该有更好的方法。有人可以建议吗? 谢谢。

3 个答案:

答案 0 :(得分:2)

您可以在列中使用GROUP BY和CASE..ELSE,因此您只有一个连接到数据表

SELECT u.id AS userid,
        MAX(CASE WHEN f.shortname = 'Department' THEN d.data ELSE '' END) AS department,
        MAX(CASE WHEN f.shortname = 'PositionRank' THEN d.data ELSE '' END) AS rank
FROM mdl_user u
JOIN mdl_role_assignments ra ON ra.userid = u.id
JOIN mdl_role r ON r.id = ra.roleid AND r.shortname =  'student'
JOIN mdl_user_info_data d ON d.userid = u.id
JOIN mdl_user_info_field f ON d.fieldid = f.id
WHERE f.shortname IN ('Department', 'PositionRank')
GROUP BY u.id

答案 1 :(得分:0)

由于自定义用户配置文件字段的灵活性,没有一种更简单的方法可以使用SQL检索它们。

如果您使用的是Moodle代码,则有内置函数可以为您检索此数据 - profile_load_custom_fields(在/user/profile/lib.php中定义)将执行此操作。它也是从get_complete_user_data调用的。但是,这两个函数都使用多个数据库查询来检索数据,因此您的版本将更有效。

答案 2 :(得分:0)

您可以使用以下代码获取用户自定义字段:

  global $USER;
  $department = $USER->profile['Department'];
  $rank = $USER->profile['PositionRank'];