我正在尝试优化此查询,但我似乎无法得到它。任何帮助都受到欢迎。这是在存储过程中,因此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;
我基本上想要获取用户可以看到的所有文件夹(要么是因为他拥有它,要么是因为他在该文件夹的一组海报中)
答案 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
和所有加入列上都有适当的索引,则可以更好地优化此算法。但是:
SELECT filders.* .... GROUP BY filders.folderId
不是严格有效的SQL - 但如果您不使用严格sql_mode
,它将起作用。从你自己的查询我可以看到你不是,所以我不会纠缠于此。