You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并含LIMIT的多段SQL查询?附数据表及尝试代码

正确合并多段查询结果的实现方式

看起来你是想把三个针对不同premium值的查询结果(每个取前3条)合并成一个结果集对吧?你之前用INNER JOIN的思路走偏了——JOIN是用来关联表、匹配行的,而你要的是把多个独立查询的结果拼接起来,这时候应该用UNION ALL来实现。

先明确你的表结构和数据:
表query_test包含字段:id, pname, company_id, premium
测试数据:

INSERT INTO query_test (id, pname, company_id, premium) VALUES
(1, 'aaaa', 1, '1'),
(2, 'bbbb', 1, '2'),
(3, 'cccc', 1, '3'),
(4, 'dddd', 1, '2'),
(5, 'eeee', 1, '1'),
(6, 'ffff', 1, '3'),
(7, 'gggg', 1, '3'),
(8, 'hhhh', 1, '2'),
(9, 'iiii', 1, '1'),
(10, 'jjjj', 1, '2');

正确的SQL写法

-- 获取premium=1的前3条数据
SELECT * FROM query_test WHERE company_id = 1 AND premium = '1' LIMIT 3
UNION ALL
-- 获取premium=2的前3条数据
SELECT * FROM query_test WHERE company_id = 1 AND premium = '2' LIMIT 3
UNION ALL
-- 获取premium=3的前3条数据
SELECT * FROM query_test WHERE company_id = 1 AND premium = '3' LIMIT 3;

关键说明

  1. 为什么用UNION ALL?
    它会直接把多个SELECT的结果按顺序拼接成一个结果集,不会做去重操作(因为你的三个子查询分别对应不同的premium值,不会有重复行,用UNION ALL比UNION效率更高)。
  2. 每个子查询单独加LIMIT
    这样能确保每个premium分组都严格只返回3条数据,而不是先合并再取前N条。
  3. 字段一致性要求
    所有子查询的字段数量、顺序和数据类型必须一致,这里用SELECT *刚好满足要求。

你原来写法的问题

INNER JOIN的作用是基于关联条件(比如两个表的字段相等)把不同表的行匹配在一起,生成关联后的行数据——这和你想要的“合并多个独立查询结果”的需求完全不匹配,所以会出现语法和逻辑错误。

内容的提问来源于stack exchange,提问作者user9341437

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:28:24