2012-07-19 62 views
0

我想优化这个查询,但我似乎无法得到它。任何帮助都比欢迎。这是在一个存储过程中,所以1被一个IN参数替代。一个用户在一个组中的用户数量mysql


userGroupRelation

userGroupID BIGINT - >外键userGroupID分组表

用户ID 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

你可以在http://sqlfiddle.com发表表格结构吗 – 2012-07-19 04:24:01

回答

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,它将起作用。从你自己的问题我可以看出你不是,所以我不会深究这一点。
+0

谢谢你的回应。对不起,我没有澄清,但我确实需要知道是否在文件夹中有其他海报,这就是为什么我添加了IN(因为如果没有,文件夹的所有者不会看到真正的数量其他海报 – Manatax 2012-07-19 06:11:14

+0

不是一个独特的表格/别名... – Manatax 2012-07-19 06:43:48

+0

我看到了,那么请忽略第二个提供的解决方案。你也对“不是一个独特的表/别名” - 我没有架构/数据工作 - 因此无法验证查询,不仅有不明确之处 - 它也不容易解决。第二个提供的解决方案根本不正确。 – 2012-07-19 06:53:05

相关问题