我一直在寻找合适的SQL查询来检索角色为student
的所有用户的详细信息。该信息将包括一些自定义用户配置文件字段的数据。
例如,我创建了2个用户个人资料字段,其中包含短名称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'
但我觉得应该有更好的方法。有人可以建议吗? 谢谢。
答案 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'];