【问题标题】:Auto-increment with Group BY使用 Group BY 自动递增
【发布时间】:2018-06-25 07:42:12
【问题描述】:

我有两张表如下:

合同

|

签约用户

我的工作是从 Contractuser 表中获取每个合同编号的最新发票日期并显示结果。结果表如下:

结果表

现在我想要一个自动增量列显示为我的结果集中的第一列。

我使用了以下查询:

SELECT @i:=@i+1 AS Sno,a.ContractNo,a.SoftwareName,a.CompanyName,b.InvoiceNo,b.InvoiceDate,
b.InvAmount,b.InvoicePF,max(b.InvoicePT) AS InvoicePeriodTo,b.InvoiceRD,b.ISD
     FROM contract as a,contractuser as b,(SELECT @i:=0) AS i
     WHERE a.ContractNo=b.ContractNo
     GROUP BY b.ContractNo
     ORDER BY a.SoftwareName ASC;

但似乎自动递增是在 group by 过程之前执行的,因为序列号以非连续方式显示。

【问题讨论】:

  • 您无法真正完成这项工作,因为它确实会评估每一行的变量。您需要的是一个子查询来处理分组,然后将增量加入结果。
  • 为了将来参考,最好以纯文本格式提供您的数据,因为如果有人想尝试复制您的源数据/结果,复制/粘贴它会更容易。
  • +user2366842 注意点

标签: mysql sql group-by auto-increment


【解决方案1】:

GROUP BY 和变量不一定按预期工作。只需使用子查询:

SELECT (@i := @i + 1) AS Sno, c.*
FROM (SELECT c.ContractNo, c.SoftwareName, c.CompanyName, cu.InvoiceNo, cu.InvoiceDate,
             cu.InvAmount, cu.InvoicePF, max(cu.InvoicePT) AS InvoicePeriodTo, cu.InvoiceRD, cu.ISD
      FROM contract c JOIN
           contractuser as b
           ON c.ContractNo = cu.ContractNo
      GROUP BY cu.ContractNo
      ORDER BY c.SoftwareName ASC
     ) c CROSS JOIN
     (SELECT @i := 0) params;

注意事项:

  • 我还修复了JOIN 语法。 切勿FROM 子句中使用逗号。
  • 我还添加了合理的表格别名——表格的缩写。 ab 没有任何意义,因此它们使查询更难理解。
  • 我只留下了一个键GROUP BY。它确实应该包含所有未聚合的键,但在某些情况下是允许的。

【讨论】:

  • 我刚刚删除了 FROM 子句中的 SELECT @i:=@i+1 ,查询就像一个魅力。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2015-03-24
  • 2021-12-30
  • 1970-01-01
  • 2016-03-07
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多