Как сообщить MariaDB / MySQL, что столбец уникален из-за предложения HAVING - PullRequest
0 голосов
/ 15 января 2020

С ONLY_FULL_GROUP_BY установить (что я не хочу / не могу изменить) следующие ошибки запроса с

ОШИБКА 1055 (42000) : 'dbname .test1.person_id 'отсутствует в GROUP BY

(или эквивалентном более длинном сообщении в mariadb).

CREATE TABLE test1 (
    thing VARCHAR(16),
    person_id INT
);

SELECT
    thing,
    person_id
FROM
    test1
GROUP BY
    thing
HAVING
    COUNT(DISTINCT person_id) = 1

Как я могу "сказать" MySQL, что я знаю person_id однозначен из-за предложения HAVING? Я не хочу использовать ANY_VALUE, потому что он недоступен во всех базах данных, где должен выполняться этот код.

Редактировать: правильно было указано, что что-то вроде MAX будет работать здесь person_id, но МАКСИМАЛЬНОЕ значение person_id на самом деле не имеет смысла и воспринимается как fr agile для будущих изменений. Есть ли лучший способ структурировать запрос так, чтобы он не требовался?

Ответы [ 2 ]

4 голосов
/ 15 января 2020

Просто используйте MAX() агрегирование для person_id столбца

SELECT
    thing,
    MAX(person_id) AS person_id
FROM
    test1
GROUP BY
    thing
HAVING
    COUNT(DISTINCT person_id) = 1

person_id, который уже должен быть выбран отчетливо, а MAX() работает как для строковых, так и для числовых значений c. Таким образом, остается только один неагрегированный столбец, соответствующий каждому типу СУБД, включая MySQL с установленным режимом ONLY_FULL_GROUP_BY.

0 голосов
/ 16 января 2020

Один из способов решить эту проблему - использовать подзапрос, чтобы найти все вещи, уникальные для одного человека:

SELECT                  
    thing      
FROM          
    test1      
GROUP BY          
    thing     
HAVING         
    COUNT(DISTINCT person_id) = 1

, а затем получить детали, которые нам действительно нужны во внешнем запросе, теперь мы знаем, какие вещи, которые нас волнуют:

SELECT 
    person_id, 
    thing 
FROM 
    test1 
WHERE 
    thing IN 
        (
            SELECT                  
                thing      
            FROM          
                test1      
            GROUP BY          
                thing     
            HAVING         
                COUNT(DISTINCT person_id) = 1
        )
...