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

时间:2009-09-12 15:06:34

标签: mysql sql union limit

我有职位公司表,我想提取符合以下条件的20个职位:

  1. 仅来自两(2)家公司
  2. 的工作
  3. 每家公司最多可以有10个工作岗位
  4. 我使用SELECT尝试了以下UNION 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,所以任何改进建议都是值得欢迎的。

4 个答案:

答案 0 :(得分:142)

引用the docs

  

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

答案 1 :(得分:2)

根据Alex的回答并根据Joe的观察,以下内容应在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);

答案 2 :(得分:1)

@bioye 的回答需要我在 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);

答案 3 :(得分:0)

在 Teradata 中,我们不能将联合与顶级查询一起使用,如果这样做,您会收到错误,需要按如下所示进行调整。为 Teradata 用户添加解决方案。

Union and Top can written together as given below in Teradata