Как сделать правильный запрос в сложных условиях?

#mysql #sql #database

Вопрос:

У меня есть этот стол:

 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
 

Мне нужно выбрать только те имена групп, набор участников которых не меняется все время его существования(date_join == active_years_begin и (значение date_left равно null или значение active_years_end равно null) или (значение date_left == значение active_years_end)) ) для всех участников группы.

Итак, здесь правильный ответ — «Битлз», «Крылья», Группа 1, Группа 2, Группа 3, Группа 4.

Как я могу это сделать?

Комментарии:

1. Почему не Band5? В группе 5 нет изменений участников.

2. @jarlh, так оно и есть. Он начинает существовать в 2018-09-01, а в 2021-09-01 в эту группу переходит новый участник. Итак, эта группа пустовала 3 года, а затем изменилась.

3. Вы пробовали какие-либо запросы до сих пор? если да, поставьте это под сомнение для лучшего понимания

4. Я понимаю. Я думаю, у вас должен быть столик для оркестра и столик для музыкантов.

Ответ №1:

  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`)
                                          )
 

введите описание изображения здесь

Комментарии:

1. Прити, я полагаю, что ваш запрос может не дать ему требуемых результатов

2. его протестировали, ему дали правильный ответ….я также приложил скриншот вывода