ホームページ >データベース >mysql チュートリアル >1 対多の SQL 関係で最後のレコードを効率的に取得するにはどうすればよいですか?

1 対多の SQL 関係で最後のレコードを効率的に取得するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-19 12:26:091008ブラウズ

How to Efficiently Retrieve the Last Records in a One-to-Many SQL Relationship?

1 対多の関係で最新のレコードを取得するための SQL 結合

データベース クエリには、1 対多の関係から最新のエントリを取得することがよく含まれます。 「顧客」テーブルと「購入」テーブルを含むデータベースを想像してください。それぞれの購入は 1 人の顧客に属します。 このアプローチでは、単一の SELECT ステートメントを使用して顧客リストと最近の購入内容を効率的に取得します。

<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.customer_id IS NULL;</code>

説明:

  1. INNER JOIN は、「customer_id」を介して「customer」テーブルと「purchase」テーブルをリンクし、顧客を購入に関連付けます。
  2. LEFT OUTER JOIN は、各顧客の後日の追加購入を識別します。
  3. WHERE 句はこれらの追加エントリを除外し、顧客ごとの最新の購入のみを保持します。

パフォーマンスの最適化: インデックス作成

最適なパフォーマンスを得るには、列「(customer_id, date, id)」を使用して「purchase」テーブルに複合インデックスを作成します。これにより、顧客、日付、ID に基づいた購入に関する効率的なデータベース検索が可能になります。

非正規化のトレードオフ:

「顧客」テーブル内に最終購入日を保存すると (非正規化)、頻繁に行われる最終購入クエリのパフォーマンスが向上します。 ただし、これによりデータの冗長性が生じ、整合性の問題が発生する可能性があります。

LIMIT 1 条項: 信頼性の低い代替案

「購入」テーブル ID が一貫して日付順である場合、サブクエリで LIMIT 1 を使用するとクエリが簡素化されます。 ただし、この方法の信頼性は、LEFT OUTER JOIN アプローチよりも一貫性が低くなります。 一般に、堅牢性のため LEFT OUTER JOIN メソッドが好まれます。

以上が1 対多の SQL 関係で最後のレコードを効率的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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