ホームページ >データベース >mysql チュートリアル >複数の結合操作を使用して 1 対多の関係で最後のレコードを効率的に取得する方法

複数の結合操作を使用して 1 対多の関係で最後のレコードを効率的に取得する方法

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-19 12:17:09824ブラウズ

How to Efficiently Retrieve the Last Record in One-to-Many Relationships Using Multiple Join Operations?

1 対多のデー​​タベース関係における最後のレコードの取得の最適化

1 対多のデー​​タベース関係 (顧客とその購入など) の各グループの最新レコードを効率的に取得することは、一般的なデータ操作タスクです。 この記事では、結合操作を使用した効果的なクエリ戦略について説明します。

クエリの構築と拡張

次のクエリは、各顧客の最後の購入の詳細を取得します。

<code class="language-sql">SELECT c.*, p1.*
FROM customer c
JOIN purchase p1 ON (c.id = p1.customer_id)
LEFT OUTER JOIN purchase p2 ON (c.id = p2.customer_id AND p1.date < p2.date)
WHERE p2.id IS NULL;</code>

このクエリは LEFT OUTER JOIN を使用して、各購入を同じ顧客による他の購入と比較します。 WHERE 句は結果をフィルタリングし、最新の購入 (以降の購入が存在しない) のみが含まれるようにします。

インデックスの最適化

クエリのパフォーマンスを最適化するには、purchase 列を使用して (customer_id, date, id) テーブルに複合インデックスを作成します。このカバーインデックスにより結合操作が高速化され、追加のテーブルスキャンが回避されます。

非正規化に関する考慮事項: トレードオフ

customer テーブルに "last_purchase" 列を追加すると (非正規化)、クエリが簡素化されますが、データの冗長性が生じ、更新異常が発生する可能性があります。 このアプローチを実装する前に、その影響を慎重に検討してください。通常、このようなクエリが非常に頻繁に行われる場合にのみ有益です。

ソートされた ID を使用した簡素化されたクエリ

purchase テーブルの id 列が本質的に日付順 (降順) である場合、LIMIT を使用した単純化されたクエリが可能になります。

<code class="language-sql">SELECT c.*, p1.*
FROM customer c
JOIN purchase p1 ON (c.id = p1.customer_id)
WHERE p1.id = (
    SELECT MAX(id)
    FROM purchase
    WHERE customer_id = c.id
)
LIMIT 1;</code>

ただし、これは「最新」の購入を反映する id 列の一貫した順序に依存していることに注意してください。 この順序から逸脱すると、誤った結果が生成されます。

以上が複数の結合操作を使用して 1 対多の関係で最後のレコードを効率的に取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。