由于 HAVING 子句,如何告诉 MariaDB/MySQL 列是唯一的

How to tell MariaDB/MySQL that a column is unique due to HAVING clause

使用 ONLY_FULL_GROUP_BY 设置(我不想 to/can 不更改)以下查询错误

ERROR 1055 (42000): 'dbname.test1.person_id' isn't in 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

我如何 "tell" MySQL 我知道 person_id 是明确的,因为 HAVING 子句?我不想使用 ANY_VALUE 因为在这段代码需要 运行.

的所有数据库中都不可用

编辑:有人正确地指出,像 MAX 这样的东西可以在 person_id 上工作,但是 person_id 的 MAX 值并没有真正意义并且感觉很脆弱到未来的变化。有没有更好的方式来构建查询而不是必需的?

只需对 person_id 列使用 MAX() 聚合

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

person_id 已被明确选择,而 MAX() 适用于字符串或数值。这样,只剩下一个符合每种类型 DBMS 的非聚合列,包括 MySQL 模式设置为 ONLY_FULL_GROUP_BY

解决这个问题的一种方法是使用子查询来查找一个人独有的所有事物:

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
        )