您可以“安全”地使用这些查询,也就是说,如果额外的列是功能依赖在您分组依据的列上:
SELECT c.parent_id, COUNT(*), p.any_column
FROM child_table c
JOIN parent_table p USING (parent_id)
GROUP BY c.parent_id;
上面的例子可以在 SQLite 中运行,并产生明确的结果,因为没有办法p.any_column
每组可以有多个值。然而,这个查询严格违反了SQL标准,大多数品牌的RDBMS都会报错。
不过,编写产生不明确结果的查询太容易了。当您命名的列每组有多个值时,您无法控制结果集中返回哪个值。
实际上,MySQL 返回的值来自first相对于物理存储的行,SQLite 从last排。但它完全依赖于实现并且不可靠。如果任一软件的下一个版本更改了其内部结构,则升级后您可能会得到不同的查询结果。所以最好不要依赖这种行为。
关于你的例子,其中content
应该“直观地”具有来自行的值sequence
是最大。但这真的是直观的吗?考虑以下其他情况:
SELECT MAX(sequence), MIN(sequence), type, content
FROM message
GROUP BY type
那么现在哪一行提供值content
?所在行sequence
是 MAX,或者是其中的行sequence
is MIN?
如果您使用非唯一列(例如date
),并且有多行具有相同的 MAX 值date
,但不同的值content
?
SELECT MAX(date), type, content
FROM message
GROUP BY type
其他聚合函数怎么样?AVG()
or SUM()
?聚合的值可能与表中没有单独的行相对应。现在哪一行应该提供值content
?
SELECT AVG(sequence), type, content
FROM message
GROUP BY type