#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. его протестировали, ему дали правильный ответ….я также приложил скриншот вывода