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

Moodle:SQL,用于列出所有用户(带有自定义用户配置文件字段),sql,database,moodle,Sql,Database,Moodle,我正在寻找合适的SQL查询来检索角色为student的所有用户的详细信息。这些信息将包括一些自定义用户配置文件字段的数据 例如,我创建了两个用户配置文件字段,它们的短名称分别为Department和PositionRank。我已成功使用以下SQL检索列表: SELECT DISTINCT u.id AS userid, department_data.data AS department, rank_data.data AS rank FROM mdl_user u JOIN mdl_r

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

例如,我创建了两个用户配置文件字段,它们的短名称分别为
Department
PositionRank
。我已成功使用以下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'
但我觉得应该有更好的办法。谁能给点建议吗?
谢谢。

您可以在列中使用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

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


如果您使用的是Moodle代码,那么有一些内置函数可以为您检索这些数据——profile_load_custom_字段(在/user/profile/lib.php中定义)将执行此操作。它也从get_complete_user_数据调用。但是,这两个函数都使用多个DB查询来检索数据,因此您的版本将更加高效。

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

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

我不熟悉moodle,但从您的查询来看,它看起来像一个EAV类型的数据库。EAV数据库的基本缺陷是查询的复杂性。我需要在SQL查询中获取它们。一个小提示,对某些人来说可能很明显:为要检索的每个用户配置文件字段添加额外的MAX(当f.shortname='shortname'然后是d.data ELSE''END)作为shortname,并将shortname添加到WHERE in()语句中。