使用 INNER JOIN 获取最后一条记录
Posted
技术标签:
【中文标题】使用 INNER JOIN 获取最后一条记录【英文标题】:Get the last record with INNER JOIN 【发布时间】:2021-12-26 07:56:45 【问题描述】:我试图获得最后一条记录,但我获得了第一条记录。 我做错了什么?
我的表权限
|id|pid|uid|
| 1| 2 | 2 |
| 2| 5 | 2 |
我的餐桌水果
|id|pid|number1|number2|
|1 | 1 | 50 | 100 |
|2 | 1 | 10 | 100 |
|3 | 1 | 100 | 100 | <== Try get last record
我想得到最后一条记录,但我不能。
我创建了查询,但不起作用:
SELECT DISTINCT(fruits.pid), permission.pid, fruits.number1, fruits.number2
FROM permission
LEFT JOIN fruits ON permission.pid = fruits.pid
WHERE permission.uid = '2'
GROUP BY fruits.pid
ORDER BY fruits.id DESC
我需要结果:
|pid|pid|number1|number2|
|3 | 1 | 100 | 100 |
【问题讨论】:
您选择最后一条记录的标准是什么?最大的 id 或最大的数字 1 还是什么? @ProGu 最大 id 为什么不直接通过 DESC 订购并选择前 1 名? 为什么我需要最后的数据。 DESC 不适用于获取最后的数据。 你想用 DISTINCT 完成什么?不是这样的 【参考方案1】:您的联接不联接任何行。 fruits.pid
的值始终为 1。permissions.pid
的值为 (2, 5)。因此,您对fruits.pid = permission.pid
的加入找不到任何匹配的行,因此您没有得到您期望的结果。如果您在查询中删除 DISTINCT
并删除 GROUP BY
(这会导致它在 mysql 8 中失败),您的查询会产生:
pid pid number1 number2
null 2 null null
null 5 null null
你想要的行不在结果集中,所以你当然不会得到它。
您遇到的另一个问题是数字 3 不在 fruits.pid
列中。这是一个id
值,所以我怀疑你加入了错误的领域。并且您将permission.pid
作为查询返回的第二个字段,但该列仅包含 2 和 5,如前所述,但您希望那里的值为 1;因此,您似乎希望将fruits.pid
作为结果集的第二列返回。所以像:
SELECT fruits.id, fruits.pid, fruits.number1, fruits.number2
FROM fruits
LEFT JOIN permission
ON permission.id = fruits.pid
WHERE permission.uid = '2'
ORDER BY fruits.id DESC
db<>fiddle here
【讨论】:
以上是关于使用 INNER JOIN 获取最后一条记录的主要内容,如果未能解决你的问题,请参考以下文章
使用 Inner Join 确定表中特定记录和相关事件之间的间隔
SQL left joinright join和inner join的区别以及where的搭配使用