我有3张桌子:
程序(关于不同内部程序的某种信息)
procedure_department(链接表,每个程序对哪个部门有效)
权限(每个用户可以添加/编辑/删除他获得权限的程序)
我愿意选择当前用户可以访问或添加自己的所有程序。
$sql = "SELECT p.id, p.name, p.type, p.status
FROM procedures AS p
LEFT JOIN procedure_department AS pd ON p.id = pd.procedureID
WHERE p.addedBy = 47 OR pd.departmentID IN (SELECT `option` FROM permissions WHERE user = 47 AND module = 'info' AND permission = 'add') ";
然而,执行需要数年时间,我希望从结构或查询的角度看待任何优化建议。
答案 0 :(得分:1)
尽管在最近的版本中已经修复了这个问题,但某些版本的MySQL在使用子查询优化in
方面做得不好。您可以将其替换为exists
:
SELECT p.id, p.name, p.type, p.status
FROM procedures p LEFT JOIN
procedure_department pd
ON p.id = pd.procedureID
WHERE p.addedBy = 47 OR
exists (SELECT 1
FROM permissions
WHERE user = 47 AND module = 'info' AND permission = 'add' and
option = pd.departmentID
);
为获得最佳效果,请在permissions(option, user, module, permission)
上添加索引。