ORDER BY COUNT()没有子查询

时间:2015-01-20 10:03:25

标签: mysql sql count subquery

我有一个包含3个表的简单权限系统:userspermissionspermission_user。我想获得所有已授予权限的所有权限。结果应按以下顺序排序:

  1. 用户的权限数(他的权力),最强的第一
  2. 创建日期的用户,最早的用户
  3. 权限(weight列)的权重,最小的第一个
  4. 这是我的疑问:

      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,但这可能吗?

1 个答案:

答案 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;