使用 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的搭配使用

inner join 还是 left join 什么区别啊

join,left join,inner join的区别?

inner join/ left join/right join 之间的区别

inner join和left join right join 的区别?