I have this table:
id band_id musician_id date_join date_left band_name active_years_begin active_years_end 1 2 7 1960-01-01 1970-12-31 The Beatles 1960-01-01 1970-12-31 2 2 8 1960-01-01 1970-12-31 The Beatles 1960-01-01 1970-12-31 3 2 9 1960-01-01 1970-12-31 The Beatles 1960-01-01 1970-12-31 4 2 10 1960-01-01 1970-12-31 The Beatles 1960-01-01 1970-12-31 5 3 9 1971-12-31 1981-01-01 Wings 1971-12-31 1981-01-01 6 6 5 2017-08-01 NULL Band1 2017-08-01 NULL 7 7 6 2019-09-01 NULL Band2 2019-09-01 NULL 8 4 5 2018-09-01 NULL Band3 2018-09-01 NULL 9 5 5 2018-09-01 NULL Band4 2018-09-01 NULL 10 9 5 2021-09-01 NULL Band5 2018-09-01 NULL
I need to select only that band_names which participant set is not changed all time of its existance(date_join == active_years_begin and (date_left is null or active_years_end is null) or (date_left == active_years_end)) ) for all band participants.
So here right answer is The Beatles, Wings, Band1, Band2, Band3, Band4.
How can I do that?
Advertisement
Answer
 SELECT DISTINCT band_name 
 FROM year_tbl as a 
 WHERE a.date_join IN (
                       SELECT `active_years_begin` 
                       FROM `year_tbl`) 
                       AND ((a.date_left IS NULL 
                       OR a.active_years_end IS NULL) 
                       OR a.date_left IN (
                                          SELECT active_years_end 
                                          FROM `year_tbl`)
                                          )
