【问题标题】:Amount of users in a group where one particular user is present mysql存在一个特定用户的组中的用户数量mysql
【发布时间】:2012-07-19 03:54:11
【问题描述】:

我正在尝试优化此查询,但我似乎无法得到它。任何帮助都非常受欢迎。这是在存储过程中,因此 1 被 IN 参数替换。


userGroupRelation

userGroupID BIGINT --> 组表中 userGroupID 的外键

userID BIGINT --> 用户表的外键


表格文件夹

ownerID BIGINT --> 用户表的外键

postersGroup BIGINT --> 组表中 userGroupID 的外键

其他东西...


SELECT folders.*,COUNT(userGroupRelation.userID) AS users
  FROM folders
LEFT JOIN userGroupRelation
  ON folders.postingGroupID = userGroupRelation.userGroupID
WHERE folders.ownerID = 1
  OR userGroupRelation.userGroupID IN (
    SELECT userGroupID FROM userGroupRelation WHERE userID = 1)
GROUP BY folders.folderID;

我基本上想要获取用户可以看到的所有文件夹(因为他拥有它或者因为他在该文件夹的一组海报中)

【问题讨论】:

标签: mysql query-optimization


【解决方案1】:

我建议两种方法。一个与您自己的类似,但删除了子查询并更正了COUNT 子句。我应该提一下,从您的问题中不清楚 COUNT ... AS users 结果是否在这里很重要,因为您只指定要获取用户的所有文件夹。

SELECT 
  folders.*,
  COUNT(DISTINCT IFNULL(userGroupRelation.userID, folders.ownerID)) AS users
FROM 
  folders
  LEFT JOIN userGroupRelation ON folders.postingGroupID = userGroupRelation.userGroupID
WHERE 
  folders.ownerID = 1
  OR userGroupRelation.userID = 1
GROUP BY 
  folders.folderID
;

这比您自己的解决方案要好一些,因为子查询被消除了,但它仍然留下难以优化的 OR 条件——它适用于两个不同的表。

编辑:下一个解决方案既不能回答问题,也根本不起作用:(

一种完全不同的方法是从users 表开始(当然,假设你有一个):

SELECT 
  folders.*
FROM 
  users
  LEFT JOIN folders ON (folders.ownerID = users.id)
  LEFT JOIN userGroupRelation ON (userGroupRelation.userId = users.id)
  LEFT JOIN folders ON (folders.postingGroupID = userGroupRelation.userGroupID)
WHERE 
  users.id = 1
GROUP BY 
  folders.folderID
;

如果您在users.id 和所有连接列上都有适当的索引,那么这个优化得更好。然而:

  1. 它不会告诉您每个文件夹的(其他)用户数量
  2. SELECT filders.* .... GROUP BY filders.folderId 不是严格有效的 SQL——尽管如果您不使用严格的 sql_mode,它会起作用。从你自己的查询中我可以看出你不是,所以我不会详述。

【讨论】:

  • 感谢您的回复。很抱歉我没有澄清,但我确实需要知道文件夹中是否还有其他海报,这就是我添加 IN 的原因(因为如果没有,文件夹的所有者将看不到实际数量其他海报。
  • 我明白了,那么请忽略第二个提供的解决方案。您对“不是唯一的表/别名”也是正确的——我没有要处理的架构/数据——因此无法验证查询。不仅有歧义——它也不容易解决。提供的第二种解决方案完全不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2020-12-01
  • 2021-04-07
相关资源
最近更新 更多