Как использовать GROUP BY после нескольких UNION SELECT без получения НЕЗАГРУЖЕННОЙ ошибки КОЛОННЫ? - PullRequest
0 голосов
/ 02 апреля 2020

Позвольте мне объяснить вам мою проблему на примере:

Учитывая пару member_id, мне нужно выяснить, к какой команде они принадлежат:

SELECT 
team_name, member_id, last_updated
    FROM
        (SELECT 'red team' AS team_name, su.* 
    FROM 
        'red_table' su
        UNION SELECT 
        'blue team' AS team_name, mu.*
    FROM 
        'blue_table' mu 
        UNION SELECT 
        'green team' AS team_name, mh.*
    FROM 
        'green_table' mh 
        UNION SELECT 
        'black team' AS team_name cm.*
    FROM 'black_table' cm) a
WHERE
    member_id IN ('123456','987654', '666666')

Работает отлично:

team_name | member_id | last_updated
blue_team | 987654 | 2020-03-11
green_team | 123456 | 2020-04-08
black_team | 123456 | 2018-08-05

Однако мои проблемы начались, когда мне нужно было удалить более старую информацию, оставив только самую последнюю, как показано:

team_name | member_id | last_updated
blue_team | 987654 | 2020-03-11
green_team | 123456 | 2020-04-08

Для этого я добавил следующие строки:

SELECT 
 team_name, member_id, 
 MAX(last_updated) AS most_recent
FROM (

SELECT 
team_name, member_id, last_updated
    FROM
        (SELECT 'red team' AS team_name, su.* 
    FROM 
        'red_table' su
        UNION SELECT 
        'blue team' AS team_name, mu.*
    FROM 
        'blue_table' mu 
        UNION SELECT 
        'green team' AS team_name, mh.*
    FROM 
        'green_table' mh 
        UNION SELECT 
        'black team' AS team_name cm.*
    FROM 'black_table' cm) a
WHERE
    member_id IN ('123456','987654', '666666')

) as test

GROUP BY team_name

Всякий раз, когда я пытаюсь использовать код, я получаю следующую ошибку:

SQL Error [1055] [42000]: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.member_id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

После поиска здесь на SO я нашел следующее решение

SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

но не применимо к моему делу, потому что у меня нет административного контроля над базами данных.

Пожалуйста, не могли бы вы показать мне, что я делаю неправильно?

Большое спасибо

...