I am trying to write an SQL query for my database that will retrieve all of a particular users events. If they are marked as recurring, I want them to show up weekly for a period of 52 weeks after its start date. Is there a better way of doing this? My current code seems quite clunky.
My tables are structured as follows :
event (
event_id INT NOT NULL AUTO_INCREMENT, (PK)
title VARCHAR(80) NOT NULL,
description VARCHAR(200),
event_start DATETIME,
event_end DATETIME,
group_id INT NOT NULL,
recurring BOOLEAN
);
Users{
UserID (PK)
Username
}
Groups{
GroupID (PK)
GroupName
}
Membership{
UserID (FK)
GroupID (FK)
}
Here is the query I have at the moment, it will not currently work, can anyone please help me with it?
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
AND m.UserID = ?
AND e.event_start >= ?
AND e.event_end <= ?
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,
(SELECT row_number() OVER (ORDER BY Object_ID) AS weeks
FROM SYS.OBJECTS) AS w
WHERE NOT e.recurring
AND m.user_id = ?
AND e.event_start >= ?
AND e.event_end <= ?", username, start, end, username, start, end
);
Can anyone help me adapt my code so that it selects all events that are not recurring and it selects recurring events at the same time for a period of 52 weeks?