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
相关产品推荐
相关产品推荐

