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


70

我有一个“工作”和“公司”表,我想提取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

我是MySQL的新手,所以意识到可能有一种比UNION更好的方法来执行此操作,因此绝对欢迎提出改进建议。

Answers:


180

引用文档

要将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);

我正在查看MySQL文档,该文档说ORDER BY是在UNION之后出现的,而忘了括号了!谢谢

@Mauro,车NE DICI迪accettare LA risposta,SE TI risolve IL problema,哎- !)美国IL SEGNO嘀“对号”心腹IL NUMERO二upvotes(attualmente TRE ...)...
亚历克斯·马尔泰利

13
这在MySql中有效,但如果有人在Google上遇到此问题,SQLite似乎不会支持SQLite
Joe Lyga

3
最多返回20条记录。并且只有那些是唯一的行。U必须在非唯一行上使用UNION ALL。
hugo24

2

根据Alex的观察结果,改进Alex的答案,以下内容应在SQLite中起作用:

SELECT * FROM 
(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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.