問題:
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 )
このクエリは、結合テーブルにプライマリ テーブルよりも大幅に多くのレコードが含まれている場合でも、優れたパフォーマンスを示します。
代替アプローチ:
サブクエリ アプローチは一般に最適ですが、利用可能な代替方法もあります。ただし、潜在的なパフォーマンスへの影響を考慮することが重要です。
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;
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 サイトの他の関連記事を参照してください。