根据标准搜索最旧条目的记录的最有效方法

时间:2012-12-17 19:36:57

标签: mysql

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

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

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

我基本上有一个按钮,单击该按钮将搜索数据库中最旧的现有注释,然后返回与该注释关联的客户。如果我能提供任何其他信息,请告诉我。非常感谢...

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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语句。