Mysql:行分组时提供的值有多可靠?

Mysql:行分组时提供的值有多可靠?,mysql,sql,group-by,sql-order-by,Mysql,Sql,Group By,Sql Order By,我认为这是一个相对高级的问题,我可能很难问清楚。因此,对于任何胡言乱语,请提前道歉 我喜欢Mysql的分组功能。MIN、MAX等使按某个公共因子对行进行分组变得容易,然后获取分组行的每个池的显著特征。但我要问的问题与我不希望这种行为发生的情况有关;相反,在特定情况下,我希望确保当我将一组(比如说10行)分组到一行中时,对于每行不同的任何值,结果分组行中显示的所有值都来自相同的预分组行。我的问题:这可能吗?有我应该注意的凹坑吗 让我分享一下这个查询的结构。在核心,它有一个父表t1连接到一个子表t2

我认为这是一个相对高级的问题,我可能很难问清楚。因此,对于任何胡言乱语,请提前道歉

我喜欢Mysql的分组功能。MIN、MAX等使按某个公共因子对行进行分组变得容易,然后获取分组行的每个池的显著特征。但我要问的问题与我不希望这种行为发生的情况有关;相反,在特定情况下,我希望确保当我将一组(比如说10行)分组到一行中时,对于每行不同的任何值,结果分组行中显示的所有值都来自相同的预分组行。我的问题:这可能吗?有我应该注意的凹坑吗

让我分享一下这个查询的结构。在核心,它有一个父表t1连接到一个子表t2。在进行任何分组或排序之前,查询结果可能会多次列出与不同t2记录和值关联的相同t1记录。我希望对最终输出进行分组,以便每个t1记录只显示一次,并且每行中显示的t2值反映与该t1记录相关联的所有t2记录中优先级最高的t2记录。例如,请参见下面我的简化查询

根据我的实验,嵌套查询似乎应该能够做到这一点,我先排序,然后分组。GROUP操作似乎可靠地保留了它遇到的第一行的值,这意味着如果我先排序,然后再分组,我应该能够合理地控制分组输出中包含哪些值

下面是我正在规划的查询结构的一个示例。我的问题:我遗漏了什么吗?你们有并没有经历过团队的行为方式会让我觉得这是一个糟糕的计划?你能想出一个更简单的方法来实现我所描述的吗

提前谢谢

SELECT * FROM ( SELECT # Each record from t1 may only appear once in the final output. t1.id, t1.field2, t1.field3, t1.field4, # there are multiple t2 records (each having different values & priority) # associated with each t1 record. t2.id AS t2_id, t2.field5, t2.field6, t2.priority FROM t1 JOIN t2 ON t1.id = t2.t1_id { several other joins } WHERE { lots of conditions } ORDER BY t2.priority ) t GROUP BY t.priority 这根本不可靠。DBMS未指定在所述情况下将返回的行。更进一步说,这只是MySQL的特性,在普通SQL中,这是无效的——混合使用非组列和组函数。有关此行为的更多说明,请参见手册页:

但是,这主要是在每个 未在GROUP BY中命名的未聚合列对于每个列都是相同的 组服务器可以从每个组中自由选择任何值,因此 除非它们相同,否则选择的值是不确定的。 此外,不能从每个组中选择值 受添加ORDER by子句的影响。结果集的排序 在选择值后发生,并且“排序依据”不影响 服务器选择的每个组中的哪些值


还有另一种方法可以获得在任何DBMS中都适用的正确结果。以您最初的查询为例,它看起来是这样的

SELECT 
    t1.id, t1.field2, t1.field3, t1.field4,
    t2.id AS t2_id, t2.field5, t2.field6, t2.priority
  FROM t1
    JOIN t2 ON t1.id = t2.t1_id AND t2.priority = 
        (Select Max(t2b.priority) From t2 AS t2b Where t1.id = t2b.t1_id)
    { several other joins }
  WHERE { lots of conditions }
我假设t2中只有一行t1.id,priority


希望有帮助

我想说,依靠MySQL的异常行为,允许您在SELECT列表中拥有不在GROUPBY中的列,这绝不是一个好主意。它通常是不可移植的,可能会在除SQLite之外的任何其他RDBMS上中断。它返回的非分组值本质上是不确定的,尽管它似乎在大多数情况下都会返回它遇到的第一个值。如果不使用任何聚合函数,为什么还要按任何对象分组?还是你的例子不准确?如果只想跳过重复的行,则只需要distinct关键字。别忘了,在mysql中,GROUP BY和order BY asc的结果……完全不可靠。“可靠”的反面。@Sebas,也许我没有把我的例子讲清楚。我分组的原因是为了消除重复项,但我需要根据某个计算优先级的最大值包含多个子行之一的数据,这在子查询中很难执行。谢谢@Alma。我对手册的最后一句很感兴趣,它似乎否认。。。我在上面使用的n组n结构的顺序,甚至是可能的。谢谢@jhovany。我想我把我的例子简化得有点过分了。。。优先级实际上不是一个表列,它是一个从多个表派生的动态计算值,所以不幸的是,这个解决方案在我看来并不乐观。@Topher我明白你的意思。您可以创建一个视图,并以类似于我使用的方式使用它。如果你想发布一个更接近你需要的例子,我很乐意看一看。乔文尼,谢谢你的提议。基于所有这些有用的输入,我仔细查看了我的查询,并意识到优先级值中的一个主要因素可以被外包给一个单独的计算,该计算会提前进行,并与相关表一起存储在数据库中。因此,优先级的计算变得足够简单,不再需要这些复杂的分组操作。 嘘!