Rails原生SQL关联查询:限制仅获取关联表首条记录
解决MariaDB中JOIN时仅关联每条主记录的首条关联记录问题
你的几种写法错误原因如下:
- 直接在
JOIN后加LIMIT 1:LIMIT是对整个查询结果集做限制,不能单独用于指定JOIN关联的表,属于语法错误。 - 子查询用
SELECT TOP 1 * FROM pet:MariaDB不支持TOP关键字,且即使换成LIMIT 1,该子查询是全局获取第一条宠物,而非对应每个human的第一条,导致关联结果不符合预期。
针对你的需求(动态拼接JOIN字符串,每个human仅关联其第一条pet记录),提供两种适配MariaDB的可行方案:
方案1:窗口函数ROW_NUMBER()(MariaDB 10.2及以上版本)
通过窗口函数按human_id分组,给每组内的宠物排序后取第一条:
JOIN ( SELECT *, ROW_NUMBER() OVER (PARTITION BY human_id ORDER BY id) AS rn FROM pet ) AS pet ON pet.human_id = humans.id AND pet.rn = 1
PARTITION BY human_id:按主人ID分组ORDER BY id:指定每组内宠物的排序规则(可替换为created_at等你需要的字段)pet.rn = 1:仅保留每组的第一条记录
方案2:关联子查询(兼容低版本MariaDB)
若你的MariaDB版本不支持窗口函数,可通过子查询获取每个主人的首条宠物(假设pet.id为自增主键,代表宠物创建顺序):
JOIN pet ON pet.id = ( SELECT MIN(id) FROM pet WHERE human_id = humans.id )
该子查询会为每个human找到对应的最小宠物ID(即第一条宠物),再关联到主查询中。
将上述任意一种JOIN语句直接拼接到你的动态query字符串中即可满足需求。
内容的提问来源于stack exchange,提问作者marcHoll90
相关产品推荐
相关产品推荐

