在MySQL查询中组合UNION和LIMIT操作

60 mysql sql union limit

我有一个Jobs和一个Companies表,我想提取符合以下条件的20个工作:

  1. 乔布斯只有两(2)家公司
  2. 每家公司最多可以有10个工作岗位

我曾尝试以下SELECTUNION DISTINCT,但问题是,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
Run Code Online (Sandbox Code Playgroud)

我是MySQL的新手,所以意识到可能有一种更聪明的方法来代替UNION,所以任何改进建议都是值得欢迎的.

Ale*_*lli 149

引用文档,

要将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);
Run Code Online (Sandbox Code Playgroud)

  • 这适用于MySql,但看起来不像SQLite支持这种情况,以防任何人在谷歌上遇到这个问题 (13认同)
  • 最多返回20条记录。并且仅当那些是唯一的行时。U必须在非唯一行上使用UNION ALL。 (2认同)

bio*_*oye 6

改进 Alex 的答案并根据 Joe 的观察,以下内容应该在 SQLite 中工作:

SELECT * FROM 
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
UNION
SELECT * FROM 
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
Run Code Online (Sandbox Code Playgroud)

  • 我在 SQLite 上的答案需要稍作修改。```sql SELECT * FROM (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION SELECT * FROM (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10); ```` (2认同)