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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 07:02:40