MySQL での UNION 演算子と LIMIT 演算子の併用
UNION 演算子を使用して複数のテーブルのデータをクエリする場合、LIMIT 演算子を各結果セットに個別に適用する必要がある場合があります。これは、各 SELECT ステートメントを囲む括弧内に LIMIT を配置することで実現されます。
次の例は、2 つの特定の企業から 20 の求人を抽出するように設計されており、1 社あたりの求人数は 10 件に制限されています。
間違った例:
<code class="language-sql">SELECT c.name, j.title, j.`desc`, j.link FROM jobs_job j INNER JOIN companies_company c ON j.company_id = c.id WHERE c.name IN ('Company1') UNION SELECT c.name, j.title, j.`desc`, j.link FROM jobs_job j INNER JOIN companies_company c ON j.company_id = c.id WHERE c.name IN ('Company2') ORDER BY name, title LIMIT 20;</code>
上記のコードの LIMIT 20 は、単一の SELECT ステートメントではなく、UNION 後の結果セットに作用します。
正しい例:
<code class="language-sql">(SELECT c.name, j.title, j.`desc`, j.link FROM jobs_job j INNER JOIN companies_company c ON j.company_id = c.id WHERE c.name = 'Company1' ORDER BY name, title LIMIT 10) UNION (SELECT c.name, j.title, j.`desc`, j.link FROM jobs_job j INNER JOIN companies_company c ON j.company_id = c.id WHERE c.name = 'Company2' ORDER BY name, title LIMIT 10);</code>
各 SELECT ステートメントを括弧で囲み、LIMIT 10 を個別に適用することで、結果を各企業の上位 10 位に効果的に制限します。企業のポジションが 10 件未満の場合でも、クエリは利用可能なすべての結果を返します。
このアプローチは、「単一の SELECT に ORDER BY または LIMIT を適用するには、SELECT を囲む括弧内に句を配置する」というドキュメントのガイダンスに従っています。 この方法は各サブクエリを並べ替えて制限するだけであり、最終結果の並べ替えには追加の処理が必要であることに注意してください。 最終的なマージ結果を並べ替える必要がある場合は、最外部レベルに別の ORDER BY ステートメントを追加する必要があります。
以上がMySQL の UNION 演算子を使用するときにテーブルごとの結果を制限するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。