0

私が使用しているデータベースが大幅に大きくなっている (そして拡大し続ける) ため、より効率的な方法でクエリを実行しようとしている非常に若い学習者です。

基本的に、2 つのテーブル (パートナーとメモ) があり、顧客の連絡先情報と、発信された通話に対応するメモを保存します。データベースがはるかに小さかったとき、以下のクエリは必要な目的のためにうまく機能しました. しかし、データベースが大幅に拡張された現在、クエリ時間が非常に長くかかり、多くの場合タイムアウトになっています。このクエリを実行するためのより効率的な方法があるかどうか疑問に思っていました:

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 をサブクエリで直接実行できるため、おそらくすべてを 1 つのクエリで実行できます。

于 2012-12-17T19:44:06.097 に答える