【问题标题】:How to get the last row in the table using group by with Order by DESC?如何使用 group by 和 Order by DESC 获取表中的最后一行?
【发布时间】:2020-09-23 03:44:59
【问题描述】:

我有两张桌子, 表一名称 (tbl_brands) 与这些列:

以及包含这些列的第二个表名 (tbl_loader_attachment):

我使用下面的这个 MySQL 代码按 DESC 排序:

SELECT tbl_loader_attachment.*, tbl_brands.*  FROM tbl_loader_attachment
INNER JOIN tbl_brands ON(tbl_brands.b_id=tbl_loader_attachment.b_id)
GROUP BY tbl_loader_attachment.b_id ORDER BY tbl_loader_attachment.la_id DESC

当我执行我的代码时,选择第一行出现(test1)我想选择最后一行获取(test4)

【问题讨论】:

  • 请不要在收到多个答案后更改问题。这样做会使那些冒险回答的用户已经完成的所有工作无效。
  • @TimBiegeleisen,非常感谢这对我有用,但是如果我使用 INNER JOIN 时有另一个表 (tbl_images),则会出现重复的品牌。

标签: mysql sql group-by sql-order-by


【解决方案1】:

一种方法使用GROUP BY 查询:

SELECT tla1.*, tb.*
FROM tbl_brands tb
INNER JOIN tbl_loader_attachment tla1
    ON tb.b_id = tla1.b_id
INNER JOIN
(
    SELECT b_id, MAX(la_id) AS max_la_id
    FROM tbl_loader_attachment
    GROUP BY b_id
) tla2
    ON tla1.b_id = tla2.b_id AND
       tla1.la_id = tla2.max_la_id;

如果您使用的是 MySQL 8+(或者该问题的未来读者应该使用 MySQL 8+),那么这里的另一个选项是使用 ROW_NUMBER

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY b_id ORDER BY la_id DESC) rn
    FROM tbl_loader_attachment
)

SELECT tla.*, tb.*
FROM tbl_brands tb
INNER JOIN cte tla ON tb.b_id = tla.b_id
WHERE tla.rn = 1;

【讨论】:

  • 我有多个品牌,当我使用LIMIT时只得到一个品牌,这是没有办法的。
  • @Talib 抱歉,您最初的问题对我来说并不完全清楚,我给了您另一种选择。
  • 谢谢@Tim Biegeleisen,这对我有用,但我想将我的问题更新为三个表格,然后请回答我
  • 那么您需要添加另一个联接。确切的逻辑,以及我们是否需要另一个子查询/CTE,将取决于您的实际数据。
猜你喜欢
  • 2020-03-09
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多