web-dev-qa-db-ja.com

MySQLクエリでUNION操作とLIMIT操作を組み合わせる

JobsおよびCompaniesテーブルがあり、次の条件を満たす20個のジョブを抽出したい:

  1. 指定された2社のジョブのみ
  2. 会社ごとに最大10人の仕事があります

UNION DISTINCTで次のSELECTを試しましたが、問題はLIMIT 0,10が結果セット全体に適用されることです。各企業に適用してほしい。

会社ごとに10のジョブがない場合、クエリは検出したすべてのジョブを返す必要があります。

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 DISTINCT
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 0,10

私はMySQLが初めてなので、UNIONの代わりにこれを行うスマートな方法があるかもしれないので、改善のための提案は絶対に歓迎します。

56
user172517

引用 ドキュメント

ORDER BYまたはLIMITを個々のSELECTに適用するには、SELECTを囲む括弧内に句を配置します。

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
145
Alex Martelli