由于 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
)
使用 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
)