【发布时间】:2012-03-12 20:05:05
【问题描述】:
我正在尝试编写一个 SQL (Server) 查询,该查询将返回当天的所有事件,并且对于列 recurring= 1 的所有事件,我希望它在当天返回此事件举行并在活动后的 52 周内举行。
我的表格结构如下:
Event
{
event_id (PK)
title,
description,
event_start DATETIME,
event_end DATETIME,
group_id,
recurring
}
Users
{
UserID (PK)
Username
}
Groups
{
GroupID (PK)
GroupName
}
Membership
{
UserID (FK)
GroupID (FK)
}
我目前的代码如下:
var db = Database.Open("mPlan");
string username = HttpContext.Current.Request.Cookies.Get("mpUsername").Value;
var listOfGroups = db.Query("SELECT GroupID FROM Membership WHERE UserID = (SELECT UserID from Users WHERE Username = @0 )", username);
foreach(var groupID in listOfGroups)
{
int newGroupID = groupID.GroupID;
var result = db.Query(
@"SELECT e.event_id, e.title, e.description, e.event_start, e.event_end, e.group_id, e.recurring
FROM event e
JOIN Membership m ON m.GroupID = e.group_id
WHERE e.recurring = 0
AND m.GroupID = @0
AND e.event_start >= @1
AND e.event_end <= @2
UNION ALL
SELECT e.event_id, e.title, e.description, DATEADD(week, w.weeks, e.event_start), DATEADD(week, w.weeks, e.event_end), e.group_id, e.recurring
FROM event e
JOIN Membership m ON m.GroupID = e.group_id
CROSS JOIN
( SELECT row_number() OVER (ORDER BY Object_ID) AS weeks
FROM SYS.OBJECTS
) AS w
WHERE e.recurring = 1
AND m.GroupID = @3
AND DATEADD(WEEK, w.Weeks, e.event_start) >= @4
AND DATEADD(WEEK, w.Weeks, e.event_end) <= @5", newGroupID, start, end, newGroupID, start, end
);
这导致当查询存储在数据库中的事件的日期时,将返回该事件和 52 周的事件。当一个人在这一周后的一周查询该事件时,没有返回任何内容。
【问题讨论】:
-
另一个问题中的答案为您指明了错误的方向......它与您的 SQL 无关 - 相反,您尝试传入
groupID,这是一个DynamicRecord,到db.Query。您需要从前一个结果集中获取值,并将其转换为 int。或者,我建议重新编写这段代码,因为我看不出为什么你会使用foreach而不是在你的主查询中进行额外的连接...... -
@MichaelFredrickson,感谢您的回复。我正在尝试这样做,但正如您所说,我作为 SQL Server 和 C# 的初学者正在苦苦挣扎。您是否介意建议我可以使用您建议的连接编写一个替代查询,因为我几乎没有编写这样一段代码所需的技能?
-
@MichaelFredrickson,我真的不确定在这种情况下连接是如何工作的,因为在 Groups 表中,可以有同一个 UserID 的多个实例!
-
@MichaelFredrickson 我已经编辑了上面的代码,这样 C# 中的 groupID 就不会出现错误。查询返回 OK,但即使我已将它们添加到我的表中也没有结果。
标签: c# sql sql-server database