在MySQL查询中加入/子查询混淆

时间:2014-03-11 16:22:02

标签: mysql join subquery

我已经重新编写了我的查询,直到我无法再接受它为止,所以我想知道是否有更好的解决方案?

我有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 (小提琴有效,但在实时系统中,由于我认为临时表/文件扫描,查询速度很慢 - 是否有更优化的版本?)

0 个答案:

没有答案