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

MySQL使用JOIN关联permission与fruits表时无法获取最后一条记录问题

问题定位

  • 关联条件不匹配:你的LEFT JOIN关联条件为permission.pid = fruits.pid,但你提供的permission表中uid=2的记录pid仅为2、5,fruits表所有记录pid均为1,二者没有匹配项,左连接后fruits相关字段会全部返回NULL,根本无法得到fruits.pid=1的记录。
  • 分组逻辑错误:MySQL在非ONLY_FULL_GROUP_BY模式下,GROUP BY后未指定聚合规则的字段会默认取分组内的第一条记录,你写的ORDER BY fruits.id DESC是分组完成后再对结果排序,完全不会影响分组时的取值逻辑,所以永远拿不到分组内最后一条记录。
  • 语法冗余:你已经使用GROUP BY对fruits.pid分组,每个分组仅返回一条记录,外层的DISTINCT没有任何作用。

修正方案

如果你要实现的是:permission表uid=2的记录存在的前提下,获取fruits表pid=1的最后一条记录,可直接使用以下写法:

SELECT f.id AS pid, f.pid, f.number1, f.number2
FROM fruits f
WHERE f.pid = 1
AND EXISTS (SELECT 1 FROM permission WHERE uid = '2')
ORDER BY f.id DESC
LIMIT 1

执行后得到的结果和你预期完全一致。

如果你需要严格按照两表pid关联的规则,获取每个匹配pid在fruits表的最后一条记录,可使用子查询先取每个pid的最大ID再关联取值:

SELECT f.id AS fruits_pid, p.pid AS permission_pid, f.number1, f.number2
FROM permission p
LEFT JOIN (
    SELECT pid, MAX(id) AS last_id FROM fruits GROUP BY pid
) f_last ON p.pid = f_last.pid
LEFT JOIN fruits f ON f_last.last_id = f.id
WHERE p.uid = '2'

如果你提供的permission表数据存在遗漏,实际有uid=2且pid=1的记录,使用上述关联写法就能返回你预期的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:03