ASP.NET Core MVC项目SQL查询:统计重复求助并获取最早用户ID
问题需求
开发ASP.NET Core MVC学校项目,用户可提交求助请求并展示在屏幕上。要求:当多人请求同一帮助时,仅显示一次该请求,同时展示最早提交的用户ID,并统计相同请求的人数。
数据库表结构
tableUser:存储所有用户信息helplist:存储问题描述及匹配视图的其他信息FH:关联helplist的ID与用户ID,记录用户对同一求助的请求
尝试的SQL语句
原语句(瑞典语):
SELECT Count (Beskrivning) AS HANTAL, Beskrivning, Hjalplista.HID From ((FH INNER JOIN UserTable ON UserTable.UID = FH.UID) INNER JOIN Hjalplista ON Hjalplista.HID = FH.HID) WHERE Hjalplista.KID = @KID AND Hstatus= 'Aktiv' GROUP BY Beskrivning, Hjalplista.HID, FH.Fdatum ORDER BY Fdatum ASC
翻译后(中文对应字段):
SELECT Count (Description) AS Hcount, Description, helplist.HID From ((FH INNER JOIN UserTable ON UserTable.UID = FH.UID) INNER JOIN helplist ON helplist.HID = FH.HID) WHERE helplist.KID = @KID AND Hstatus= 'Active' GROUP BY Description, helplist.HID, FH.Fdate ORDER BY Fdate ASC
注:
KID用于筛选与当前用户屏幕视图一致的请求
解决方案
你的原SQL错误地将Fdate加入GROUP BY,导致同一求助的不同提交记录被拆分显示。以下是两种可行的修正方案,实现统计人数+获取最早提交用户ID的需求:
方案1:关联子查询实现
SELECT COUNT(fh.UID) AS Hcount, h.Description, h.HID, -- 子查询获取当前求助下最早提交的用户ID (SELECT TOP 1 ut.UID FROM FH fh_sub JOIN UserTable ut_sub ON fh_sub.UID = ut_sub.UID WHERE fh_sub.HID = h.HID ORDER BY fh_sub.Fdate ASC) AS FirstSubmitterUID FROM FH fh JOIN UserTable ut ON fh.UID = ut.UID JOIN helplist h ON fh.HID = h.HID WHERE h.KID = @KID AND h.Hstatus = 'Active' GROUP BY h.Description, h.HID -- 按最早提交时间排序 ORDER BY (SELECT MIN(fh_sub.Fdate) FROM FH fh_sub WHERE fh_sub.HID = h.HID) ASC
方案2:窗口函数实现(更简洁)
WITH RankedRequests AS ( SELECT h.Description, h.HID, ut.UID, fh.Fdate, -- 统计当前求助的总请求人数 COUNT(*) OVER (PARTITION BY h.HID) AS Hcount, -- 按提交时间给同一求助的记录排名,最早的排第1 ROW_NUMBER() OVER (PARTITION BY h.HID ORDER BY fh.Fdate ASC) AS RowNum FROM FH fh JOIN UserTable ut ON fh.UID = ut.UID JOIN helplist h ON fh.HID = h.HID WHERE h.KID = @KID AND h.Hstatus = 'Active' ) -- 仅取排名第1的记录(最早提交) SELECT Description, HID, UID AS FirstSubmitterUID, Hcount FROM RankedRequests WHERE RowNum = 1 ORDER BY Fdate ASC
内容的提问来源于stack exchange,提问作者Tjabo
相关产品推荐
相关产品推荐

