ホームページ >データベース >mysql チュートリアル >複数の結合操作を使用して 1 対多の関係で最後のレコードを効率的に取得する方法
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 サイトの他の関連記事を参照してください。