在 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 个职位
我尝试了以下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 更智能的方法来执行此操作,因此绝对欢迎任何改进建议。
【问题讨论】:
【参考方案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 操作的主要内容,如果未能解决你的问题,请参考以下文章
SQL Select - Union 结合 Join 查询导致错误