0

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


userGroupRelation

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

userID BIGINT --> users 表的外键


文件夹

ownerID BIGINT --> users 表的外键

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;

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

4

1 回答 1

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——尽管如果您不使用 strict 它将起作用sql_mode。从您自己的查询中,我可以看出您不是,所以我不会详述。
于 2012-07-19T05:40:08.900 回答