mysql中存在一个特定用户的组中的用户数量

时间:2012-07-19 03:54:12

标签: mysql query-optimization

我正在尝试优化此查询,但我似乎无法得到它。任何帮助都受到欢迎。这是在存储过程中,因此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;

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

1 个答案:

答案 0 :(得分:0)

我建议采用两种方法。一个类似于您自己的,但删除子查询并更正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,它将起作用。从你自己的查询我可以看到你不是,所以我不会纠缠于此。