The approach is here:
1. , .. EndDate 2015-04-06 StartDate 2015-04-07, . :
SELECT
MemberID, MIN(StartDate) StartDate, MAX(EndDate) EndDate
FROM
(SELECT
dt.*,
IF(@previd = dt.memberid
&& DATE_ADD(@prevdate, INTERVAL 1 DAY) <= dt.StartDate, @groupid, @groupid:=@groupid + 1) GroupId,
@previd:=dt.memberid,
@prevdate:=dt.EndDate
FROM
data_table dt, (SELECT @previd:=NULL, @prevdate:=NULL, @groupid:=0) a
ORDER BY MemberID , StartDate) memberdategrouptable
GROUP BY GroupId
, MemberID, StartDate if(found_different_member || (member_same_as_previous_row && previous_end_date_does_not_match_to_current_start_date) assign_new_group_id.
:
+----------+------------+------------+---------+----------------------+-----------------------+
| MemberID | StartDate | EndDate | GroupId | @previd:=dt.memberid | @prevdate:=dt.EndDate |
+----------+------------+------------+---------+----------------------+-----------------------+
| 10 | 2015-01-01 | 9999-12-31 | 1 | 10 | 9999-12-31 |
| 10 | 2015-06-15 | 9999-12-31 | 2 | 10 | 9999-12-31 |
| 20 | 2015-01-01 | 2015-04-06 | 3 | 20 | 2015-04-06 |
| 20 | 2015-04-07 | 9999-12-31 | 3 | 20 | 9999-12-31 |
| 30 | 2015-05-06 | 9999-12-31 | 4 | 30 | 9999-12-31 |
| 40 | 2015-01-01 | 2015-03-01 | 5 | 40 | 2015-03-01 |
| 50 | 2015-01-01 | 2015-08-31 | 6 | 50 | 2015-08-31 |
+----------+------------+------------+---------+----------------------+-----------------------+
+----------+------------+------------+
| MemberID | StartDate | EndDate |
+----------+------------+------------+
| 10 | 2015-01-01 | 9999-12-31 |
| 10 | 2015-06-15 | 9999-12-31 |
| 20 | 2015-01-01 | 9999-12-31 |
| 30 | 2015-05-06 | 9999-12-31 |
| 40 | 2015-01-01 | 2015-03-01 |
| 50 | 2015-01-01 | 2015-08-31 |
+----------+------------+------------+
2. ,
SELECT
*
FROM
(SELECT
MemberID, MIN(StartDate) StartDate, MAX(EndDate) EndDate
FROM
(SELECT
dt.*,
IF(@previd = dt.memberid
&& DATE_ADD(@prevdate, INTERVAL 1 DAY) <= dt.StartDate, @groupid, @groupid:=@groupid + 1) GroupId,
@previd:=dt.memberid,
@prevdate:=dt.EndDate
FROM
data_table dt, (SELECT @previd:=NULL, @prevdate:=NULL, @groupid:=0) a
ORDER BY MemberID , StartDate) memberdategrouptable
GROUP BY GroupId) memberdaterange
WHERE
StartDate <= '2015-01-01'
AND EndDate >= '2015-08-31'
Reuslt
+----------+------------+------------+
| MemberID | StartDate | EndDate |
+----------+------------+------------+
| 10 | 2015-01-01 | 9999-12-31 |
| 20 | 2015-01-01 | 9999-12-31 |
| 50 | 2015-01-01 | 2015-08-31 |
+----------+------------+------------+