ホームページ > データベース > mysql チュートリアル > 他の列データを保持しながら、データベースから一意の電子メール アドレスを効率的に抽出するにはどうすればよいですか?

他の列データを保持しながら、データベースから一意の電子メール アドレスを効率的に抽出するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-04 09:27:35
オリジナル
425 人が閲覧しました

How Can I Efficiently Extract Unique Email Addresses from a Database While Retaining Other Column Data?

一意の電子メール抽出のための DISTINCT クエリの最適化

データベースにクエリを実行して複数の列からデータを取得する場合、DISTINCT 句は通常、電子メールを抽出するために使用されます。行を複製し、一意性を確保します。ただし、特定のシナリオでは、電子メール アドレスなどの特定の列にのみ DISTINCT を適用する必要がある場合があります。

次のクエリを検討してください。

SELECT ID, Email, ProductName, ProductModel FROM Products;
ログイン後にコピー

これを変更する必要がある場合は、別の電子メール アドレスのみを返し、他の列での重複を許可するクエリでは、従来の DISTINCT 句では不十分な場合があります。代わりに、「パーティション内の行番号付け」と呼ばれる手法を使用できます。

ウィンドウ関数を使用したクエリの最適化

望ましい結果を達成するには、パーティション内でウィンドウ関数を利用できます。サブクエリ。 SQL Server 2005 以降では、次のクエリを使用できます。

SELECT *
FROM (
    SELECT ID, 
            Email, 
            ProductName, 
            ProductModel,
            ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn
    FROM Products
) a
WHERE rn = 1;
ログイン後にコピー

このクエリでは、まずウィンドウ関数を使用して派生テーブルを作成し、各電子メール パーティション内の各行に一意の行番号 (rn) を割り当てます。最後の行から始めます。次に、最も外側のクエリは、rn 値が 1 の行のみを含むように派生テーブルをフィルタリングし、一意の電子メール アドレスごとに 1 行のみが含まれるようにします。

フィルタリングの例

さらに、フィルタリング基準をサブクエリに組み込んで、結果をさらに絞り込むことができます。たとえば、次の変更されたクエリは、特定の文字列を含む特定のモデルと名前を持つ製品に結果を制限します。

SELECT *
FROM (
    SELECT ID, 
            Email, 
            ProductName, 
            ProductModel,
            ROW_NUMBER() OVER(PARTITION BY Email ORDER BY ID DESC) rn
    FROM Products
    WHERE ProductModel = 2
      AND ProductName LIKE 'CYBER%'
) a
WHERE rn = 1;
ログイン後にコピー

パーティション内のウィンドウ関数と行番号を利用することで、重複する電子メール アドレスを効果的に排除できます。他の列の一意性が維持され、効率的かつ柔軟なデータ取得が可能になります。

以上が他の列データを保持しながら、データベースから一意の電子メール アドレスを効率的に抽出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート