ホームページ > データベース > mysql チュートリアル > SQL の複数の行にわたる「AND」条件を効率的にシミュレートするにはどうすればよいですか?

SQL の複数の行にわたる「AND」条件を効率的にシミュレートするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-05 17:43:44
オリジナル
562 人が閲覧しました

How to Efficiently Simulate an

SQL での複数行の "AND" のシミュレーション

リレーショナル データベースの領域では、複数の基準に基づいてデータを効率的に取得することが重要です特に大規模なデータセットを扱う場合にそうです。次のシナリオを考えてみましょう。さまざまなコンテンツに割り当てられたタグを表す、「tagid」と「contentid」という 2 つの列を含む「tags」テーブルです。目的は、特定のタグ ID セット (例: 334、338、および 342) でタグ付けされたコンテンツの「contentid」を取得することです。

単純なアプローチには、ネストされたサブクエリが含まれ、効果的に次のように変換されます。

SELECT contentid
FROM tags
WHERE tagid = 334
AND contentid IN (
    SELECT contentid
    FROM tags
    WHERE tagid = 338
    AND contentid IN (
        SELECT contentid
        FROM tags
        WHERE tagid = 342
    )
)
ログイン後にコピー

このアプローチは機能しますが、多数の tagid にとっては煩雑で非効率的になります。幸いなことに、より効率的で拡張可能なソリューションが存在します。

セットベースの操作を使用すると、サブクエリの必要性を排除した単一のクエリを作成できます。

SELECT contentID
FROM tags
WHERE tagID IN (334, 338, 342)
GROUP BY contentID
HAVING COUNT(DISTINCT tagID) = 3
ログイン後にコピー

このクエリ

  1. 「tags」テーブルをフィルタリングして、「tagid」が目的の行と一致する行を探します。 tagids.
  2. 結果を「contentID」でグループ化し、それらのタグ ID でタグ付けされたコンテンツを識別します。
  3. 「HAVING」句を使用して、指定されたすべてのタグ ID (つまり、COUNT 個) でタグ付けされたコンテンツのみが確実に表示されるようにします。一意の "tagid" = 3) が含まれています。

このソリューションは引き続き効率的ですネストされたサブクエリや再帰操作が含まれないため、タグIDが多数の場合でも同様です。時間計算量は関連するタグIDの数に対して線形のままであるため、大規模なデータセットやアドホッククエリに適しています。

以上がSQL の複数の行にわたる「AND」条件を効率的にシミュレートするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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