ホームページ >データベース >mysql チュートリアル >結合テーブルで LIMIT 1 を使用してテーブルを効率的に結合するにはどうすればよいですか?

結合テーブルで LIMIT 1 を使用してテーブルを効率的に結合するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-15 21:05:02671ブラウズ

How to Efficiently Join Tables with LIMIT 1 on a Joined Table?

結合テーブルで LIMIT 1 を使用してテーブルを効率的に結合する

問題:

1 つのテーブルのみを取得しながら 2 つのテーブルを結合するには特に結合テーブルに複数のレコードが存在するコンテキストでは、プライマリ テーブルのレコードごとに結合テーブルからのレコードを取得します。 table.

サブクエリを使用した解決策:

このアプローチは、結果を 1 つのレコードに制限しながら、結合テーブルから複数の列を選択するときに発生するエラーを効果的に回避します。重要なのは、サブクエリを利用して、目的のレコードの主キーを取得することです。次に、サブクエリを使用して、プライマリ クエリの結合テーブルをフィルタリングします。

SELECT
c.id,
c.title,
p.id AS product_id,
p.title AS product_title
FROM categories AS c
JOIN products AS p ON
p.id = (                                 --- the PRIMARY KEY
SELECT p1.id FROM products AS p1
WHERE c.id=p1.category_id
ORDER BY p1.id LIMIT 1
)

このクエリは、結合テーブルにプライマリ テーブルよりも大幅に多くのレコードが含まれている場合でも、優れたパフォーマンスを示します。

代替アプローチ:

サブクエリ アプローチは一般に最適ですが、利用可能な代替方法もあります。ただし、潜在的なパフォーマンスへの影響を考慮することが重要です。

  • GROUP BY および配列集約の使用 (LIMIT は適用されません):
SELECT
  id,
  category_title,
  (array_agg(product_title))[1]  
FROM
    (SELECT c.id, c.title AS category_title, p.id AS product_id, p.title AS product_title
    FROM categories AS c
    JOIN products AS p ON c.id = p.category_id
    ORDER BY c.id ASC) AS a 
GROUP BY id, category_title;
  • CROSS JOIN と ROW_NUMBER の使用(制限は適用されません):
SELECT
  c.id,
  c.title,
  p.id AS product_id,
  p.title AS product_title
FROM categories AS c
CROSS JOIN (SELECT product_id, title, ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY id) AS rn
            FROM products) AS p
WHERE rn = 1;

以上が結合テーブルで LIMIT 1 を使用してテーブルを効率的に結合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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