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

Posted

技术标签:

【中文标题】在 MySQL 查询中结合 UNION 和 LIMIT 操作【英文标题】:Combining UNION and LIMIT operations in MySQL query 【发布时间】:2010-11-27 18:29:41 【问题描述】:

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

    仅来自两 (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 更智能的方法来执行此操作,因此绝对欢迎任何改进建议。

【问题讨论】:

【参考方案1】:

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

【讨论】:

我们可以使用“”,也可以使用“user_defined_name1.*”代替“”。两种方法都有效【参考方案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);

【讨论】:

answer 需要对我在 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); 【参考方案3】:

引用the docs,

将 ORDER BY 或 LIMIT 应用于 单独的 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, che ne dici di accettare la risposta, se ti risolve il questiona, 是吗?!-) Usa il segno di "checkmark" sotto il numero di upvotes (attualmente tre...)。 .. 这在 MySql 中有效,但如果有人在 google 上遇到这个问题,SQLite 似乎不支持这个 它将返回最多 20 条记录。并且仅当这些行是唯一行时。你必须在非唯一行上使用 UNION ALL。 完美,正是我需要获得我需要的字段,但对我的两个查询有限制

以上是关于在 MySQL 查询中结合 UNION 和 LIMIT 操作的主要内容,如果未能解决你的问题,请参考以下文章

UNION ALL MYSQL 真的很慢

SQL Select - Union 结合 Join 查询导致错误

Mysql联合查询UNION和UNION ALL的使用介绍

在 mysql 中使用 union 和 order by 子句

mysql中的union用法

MySQL基础语法之子链接查询和特殊查询(union 和 limit)