【问题标题】:How to get last item for GROUP BY [duplicate]如何获取 GROUP BY 的最后一项 [重复]
【发布时间】:2017-12-31 10:17:51
【问题描述】:

我有一张这样的桌子:

id transaction_id auto_recurring paid_amount package_customerid
37              0              1           0                  4
45             37              1           0                  4
51              0              1           0                  4
57             51              1           0                  4
62              0              1           0                  4
67             62              1           0                  4

package_customer_id = 4 有 6 条记录。现在我想获取 4 的最后一条记录。在这种情况下 id = 67 是我想要的记录。我试试这个SELECT * FROM transactions GROUP BY package_customer_id。但我得到了 package_customer_id = 4 的第一条记录。即:id = 4 是我获取的结果。我怎样才能得到 id = 67 (我想要的记录)修改这个 sql?

【问题讨论】:

  • 请注意,使用“分组依据”时,您不一定会获得记录。您将获得与选择标准匹配的字段集合。选择中的字段(您的“*”所在的位置)需要在 where 子句中表示或使用聚合函数,如 MAX dev.mysql.com/doc/refman/5.7/en/group-by-functions.html 如果您尝试这样做,较新版本的 MySQL 将给您一个错误。跨度>

标签: mysql sql


【解决方案1】:

SELECT * FROM transactions WHERE package_customer_id = 4 ORDER BY id DESC LIMIT 1;

那将是我的目标。抱歉,我还没有测试过,我把它留给你:)

编辑:

不要忘记列名上的引号“`”:)

检查你的列名package_customer_idpackage_customerid

【讨论】:

  • 只有在字段是“保留字”时才需要反引号
  • 只有在所有格中才需要撇号 - 所以“列名”或将其省略,如“列名”
  • @Strawberry 宫缩呢?我一般不使用它们,但是... :P 注意:关键字不需要反引号
  • @xQbert 同样,我没用过,所以不知道你在说什么。
  • 这永远不会按要求工作
【解决方案2】:

你可以试试这个。

SELECT temp.* FROM (SELECT * FROM `transactions` WHERE package_customer_id = 4 order by id DESC LIMIT 1 ) AS temp GROUP BY temp.package_customer_id

【讨论】:

  • 不处理 package_CustomerID = 4
  • @xQbert 哦!!我跳过了这一点,无论如何我可以在子查询中添加 where 条件
【解决方案3】:

不要使用group by。使用where

SELECT t.*
FROM transactions t
WHERE t.id = (SELECT MAX(t2.id)
              FROM transactions t2
              WHERE t2.package_customer_id = t.package_customer_id
             );

您可以在外部查询中针对您喜欢的任何包裹客户 ID 进行过滤。

【讨论】:

  • 不处理 package_CustomerID = 4
【解决方案4】:

你可以这样使用:

SELECT * FROM transactions WHERE id IN (SELECT MAX(id) FROM transactions GROUP BY package_customerid)

【讨论】:

  • 不处理 package_CustomerID = 4
【解决方案5】:

试试这个查询

如果您需要 GROUP BY 子句:使用此查询

SELECT * FROM transactions where GROUP BY package_customerid ORDER BY package_customerid DESC LIMIT 1;

或 如果您不需要 GROUP BY 子句:使用此查询

SELECT MAX(id),transaction_id,auto_recurring,paid_amount,package_customerid FROM transactions where package_customerid=4; 

输出:

id transaction_id auto_recurring paid_amount package_customerid
67             62              1           0                  4

【讨论】:

  • 在问题中,提到使用 Group by 子句
  • 当字段值不同时,我从不理解使用不带组的聚合。那么这里会选择什么 transaction_ID 呢?为什么是62?而不是 0 51 或 37?
猜你喜欢
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多