【问题标题】:ORDER BY COUNT() without subqueryORDER BY COUNT() 没有子查询
【发布时间】:2015-01-20 10:03:24
【问题描述】:

我有一个简单的权限系统,有 3 个表:userspermissionspermission_user。我想获得所有授予的权限以及授予谁的信息。结果应按以下顺序排序:

  1. 用户的权限数(他的权力),最强的优先
  2. 创建用户的日期,最早的在前
  3. 权限权重(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,但这可能吗?

【问题讨论】:

  • Count(Distinct user_id) 可能是您正在寻找的 - 这看起来与您正在做的类似 - stackoverflow.com/questions/5737628/mysql-count-distinct
  • @Giles 我尝试按permission_user.id 分组(这是我唯一可以分组的列,因为我需要所有记录)并计算permission_user.user_id,但我得到了 1 个记录。

标签: mysql sql count subquery


【解决方案1】:

没有子查询是不行的。

您可以将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;

【讨论】:

  • 根本就没有办法避免子查询吗?
  • 试试这个。 (我不检查这个查询,但无论如何都要看看想法) SELECT u.email, p.key, COUNT(pu1.permission_id) as cnt_permisions FROM permission_user as pu JOIN permission_user as pu1 on pu1.user_id = pu.user_id LEFT JOIN users as u on u.id = pu.user_id JOIN permission_user as pu on pu.user_id = u.@98765433IN@ permissions as p on p.id = pu.permission_id GROUP BY pu1.user_id ORDER BY cnt_permisions DESC, u.created_at ASC, p.weight ASC;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多