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

时间:2013-10-10 15:14:48

标签: mysql sql group-by sql-order-by

我认为这是一个相对先进的问题,我可能很难问好。所以对任何bab呀学语都要提前道歉。

我喜欢Mysql的分组功能。 MIN(),MAX()等可以很容易地按一定的公因子对行进行分组,然后获取每个分组行池的显着特征。但我问的问题与我希望这种行为发生的情况有关;相反,在特定情况下,我想确保当我将一组(例如10个)行分组到一行中时,对于因行而异的任何值,在结果分组行中显示的所有值都是从相同的预先分组的行。我的问题:这可能吗?我应该注意哪些坑洼?

让我分享一下这个查询的结构。在核心,它有一个“父”表(这里是t1)连接到“子”表(这里是t2)。在任何分组或排序之前,查询结果可以多次列出相同的t1记录,与不同的t2记录和值相关联。我希望对最终输出进行分组,使得每个t1记录只出现一次,每行显示的t2值反映具有最高优先级的t2记录(在与之关联的所有t2记录中) t1记录)。例如,请参阅下面我的愚蠢的查询。

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

这是我正在计划的查询结构的示例。 我的问题:我错过了什么吗?您是否经历过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

2 个答案:

答案 0 :(得分:3)

不可靠。 DBMS未指定将在所述情况下返回的行。更多地说,它是唯一的MySQL功能,在普通的SQL中这将是无效的 - 混合非组列和组功能。有关此行为的进一步说明,请参见this手册页:

  

但是,这主要适用于每个中的所有值   GROUP BY中未命名的非聚合列对于每个列都是相同的   组。服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的。   此外,不能从每个组中选择值   受添加ORDER BY子句的影响。对结果集进行排序   选择值后发生,ORDER BY不影响   服务器选择的每个组中的值。

答案 1 :(得分:2)

还有另一种方法可以获得适用于任何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))

希望它有所帮助!