我已经重新编写了我的查询,直到我无法再接受它为止,所以我想知道是否有更好的解决方案?
我有5张桌子;
a" contact"表格,其中包含代理商向People添加的所有联系人备注(代理商正在联系查询)。
a" people"持有查询的表格
a"用户"持有代理人的表
a" division"持有哪个'部门'代理人照看
a" peopleOwners"包含谁拥有'的记录的表格。查询
peopleOwners是人员和用户ID的列表(因此不止一个人可以拥有联系人)。
联系人表格显示联系人的人和时间(以及显然的联系人说明)。
我试图获取一份代理商列表,其中包括他们上次联系他们拥有的每个联系人(也是他们尚未联系的联系人)的日子。
我的问题是我需要:
我正在使用一个子查询,但它花了大约40秒,因此不可行 - 我已经检查过,索引看起来没问题,查询是使用2个文件扫描显然不是&#39好的!
SELECT po.FK_DivisionID, division_Name, po.FK_UserID_Owner, u.name,
p.PK_PeopleID, CONCAT_WS(' ', ppl_Title, ppl_FirstName,
ppl_LastName) AS fullName, cc.maxID, cc.lastContact
FROM People AS p, Users AS u, Divisions AS d, PeopleOwners AS po
LEFT JOIN (
SELECT contact_inputbyID, FK_PeopleID, MAX(c.contact_created) AS maxID,
DATEDIFF(NOW(), MAX(c.contact_created)) AS lastContact
FROM Contact AS c
GROUP BY FK_PeopleID
) AS cc
ON cc.contact_inputbyID = po.FK_UserID_Owner
AND cc.FK_PeopleID=po.FK_PeopleID
WHERE po.FK_PeopleID = p.PK_PeopleID
AND po.peopleowner_removed IS NULL
AND po.FK_DivisionID=d.PK_DivisionID
AND po.FK_UserID_Owner=u.PK_UserID
如果有人能给我一些如何优化它的指示,我们将非常感激。
谢谢!
Sql我的意思是:http://sqlfiddle.com/#!2/ff7e62/2 (小提琴有效,但在实时系统中,由于我认为临时表/文件扫描,查询速度很慢 - 是否有更优化的版本?)