我有一个包含3个表的简单权限系统:users
,permissions
和permission_user
。我想获得所有已授予权限的所有权限。结果应按以下顺序排序:
weight
列)的权重,最小的第一个这是我的疑问:
SELECT `users`.`email`,
`permissions`.`key`
FROM `users`
JOIN `permission_user` ON `permission_user`.`user_id` = `users`.`id`
JOIN `permissions` ON `permissions`.`id` = `permission_user`.`permission_id`
ORDER BY (
SELECT COUNT(*)
FROM `permission_user`
WHERE `user_id` = `users`.`id`
) DESC,
`users`.`created_at` ASC,
`permissions`.`weight` ASC;
它工作正常,但我想知道是否有任何方法可以在没有子查询或计算授予的总权限的情况下执行此操作。它是结果集中存在的东西,我可以从中计算唯一的用户ID,但这可能吗?
答案 0 :(得分:0)
没有子查询就无法做到。
您可以将列cnt_permissions
添加到users
表,并在创建或更新用户权限后重新计算它。因此,您可以使用它来查询。
但如果你不喜欢那样。这个SQL查询工作得更快,因为它只进行一次子查询。
SELECT u.`email`,
p.`key`
FROM (SELECT COUNT(`permission_user`.`permission_id`) as cnt, `user_id`
FROM `permission_user`
GROUP BY `user_id`) as pucnt
LEFT JOIN `users` as u on u.`id` = pucnt.`user_id`
JOIN `permission_user` as pu on pu.`user_id` = u.`user_id`
LEFT JOIN `permissions` as p on p.`id` = pu.`permission_id`
ORDER BY
pucnt.cnt DESC,
u.`created_at` ASC,
p.`weight` ASC;