通过group by自动递增

e37o9pze  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(435)

我有两张table如下:
合同

|
合同使用者

我的工作是从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;

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

hmae6n7t

hmae6n7t1#

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 条款。
我还添加了合理的表别名--表的缩写。 a 以及 b 没有任何意义,因此它们使查询更难理解。
我离开房间了 GROUP BY 只有一把钥匙。它应该拥有所有未聚合的密钥,但在某些情况下这是允许的。

相关问题