非常初级学习者希望以更有效的方式执行查询,因为我正在使用的数据库变得越来越大(并将继续扩展)。
基本上我有两个表(合作伙伴和备注),我存储客户联系信息和与拨打电话相对应的备注。当数据库小得多时,下面的查询就可以满足我的需要。但是,现在数据库已经大幅扩展,查询时间太长,并且在许多情况下超时。我想知道是否有更有效的方法来执行此查询:
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
我基本上有一个按钮,单击该按钮将搜索数据库中最旧的现有注释,然后返回与该注释关联的客户。如果我能提供任何其他信息,请告诉我。非常感谢...
答案 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
语句。