最近需求是需要根据用户的积分进行排名。数据库使用的是mysql5.6
应该是不支持rank()函数。
然后用sql实现:
SELECT
obj.beneficiaryID,
obj.JF,
CASE WHEN @rowtotal = obj.JF THEN @rownum WHEN @rowtotal := obj.JF THEN @rownum := @rownum + 1 WHEN @rowtotal = 0 THEN @rownum := @rownum + 1 END AS rownum
FROM (SELECT
a.beneficiaryID,
SUM( b.Point ) AS JFPOINT
FROM xngdpoints a
JOIN isms_sys_pointcategorydetail b ON a.operationType = b.OpertorUserIDType
GROUP BY
a.beneficiaryID )AS obj,
(SELECT
@rownum := 0,
@rowtotal := NULL) r
然后发现可能是超长还是什么,执行sql出来没有数据。就想着那就先执行完sql,来处理datatable
if (result != null && result.Rows.Count > 0)
{
result.Columns.Add("rownum", typeof(int));
count = result.Rows.Count;
// 排名
DataTable newdt = new DataTable();
newdt = result.Copy();
int j = count;
foreach (DataRow dow in newdt.Rows)
{
foreach (DataRow row in result.Select("JF ='" + dow["JF"] + "'"))
{
row["rownum"] = j;
}
j--;
}
// 再次排序然后分页
DataView dv = result.DefaultView;
dv.Sort = " rownum asc ";
result = dv.ToTable();
DataTable newDT = new DataTable();
newDT = result.Clone();
DataRow[] rows = result.AsEnumerable().Skip((pageIndex - 1) * pageNum).Take(pageNum).ToArray();
foreach (DataRow item in rows)
{
newDT.ImportRow(item);
}
result = newDT;
}
最后的效果图如图: