0

由于我正在使用的数据库变得越来越大(并将继续扩展),这里非常初级的学习者希望以更有效的方式执行查询。

基本上,我有两个表(合作伙伴和注释),用于存储客户联系信息和对应于所拨打电话的注释。当数据库小得多时,下面的查询就可以很好地满足我的需要。但是,现在数据库已经大大扩展,查询时间太长了,而且在很多情况下会超时。我想知道是否有更有效的方法来执行此查询:

SELECT * FROM
(SELECT
partners.objectid,
partners.partner,
notes.note,
notes.datecreated,
notes.timecreated
FROM
notes
JOIN
partners
ON
notes.partnerid=partners.objectid
WHERE
partners.province
=
'BC'
AND
partners.type
=
'2'
ORDER BY
notes.datecreated DESC, notes.timecreated DESC) as noteq
GROUP BY
partner
ORDER BY
datecreated ASC, timecreated ASC
LIMIT 1

我基本上有一个按钮,单击该按钮将在数据库中搜索最旧的现有笔记,然后返回与该笔记关联的客户。如果我可以提供任何其他信息,请告诉我。提前谢谢了...

4

2 回答 2

1

@aurel.g 编写的查询可能会执行得很快,但我认为它不能满足您的要求。您似乎想要最古老的音符并获得合作伙伴。

上面的查询(也可能是您的查询)按合作伙伴分组,选择任意注释。然后它将返回最旧的任意音符。这不是一回事。

因此,如果您想要包含相关信息的最旧笔记,则需要以下内容:

SELECT partners.objectid, partners.partner, notes.note, notes.datecreated, notes.timecreated
FROM notes join
     partners
     ON notes.partnerid=partners.objectid
WHERE partners.province = 'AB' and
      partners.type = '2'
ORDER BY notes.datecreated ASC, notes.timecreated ASC
LIMIT 1

关键的区别是这个查询没有group by语句。

于 2012-12-17T20:34:29.227 回答
1

我认为关键是避免子查询。

试试这种方法:

SELECT
    partners.objectid,
    partners.partner,
    notes.note,
    notes.datecreated,
    notes.timecreated

FROM notes

JOIN partners
    ON notes.partnerid=partners.objectid

WHERE partners.province = 'AB'
    AND partners.type = '2'

GROUP BY partners.partner

ORDER BY
    notes.datecreated ASC,
    notes.timecreated ASC

LIMIT 1

所有可能都可以在一个查询中完成,因为在您发布的查询中,您避免了子查询的 ORDER BY 与顶部查询的 ORDER BY 并且 GROUP BY 可以直接在子查询中完成。

于 2012-12-17T19:44:06.097 回答