У меня две таблицы:
контракт
|
Contractuser
Моя задача состояла в том, чтобы получить самую последнюю дату счета за каждый номер контракта из таблицы 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
и переменные не обязательно работают должным образом. Просто используйте подзапрос:
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
только одним ключом. Он должен действительно иметь все неагрегативные ключи, но это разрешено при некоторых обстоятельствах.