2

我认为这是一个相对高级的问题,我可能很难问得好。所以提前为任何喋喋不休道歉。

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

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

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

这是我正在计划的查询结构的示例。我的问题:我错过了什么吗?您是否经历过 GROUP 的行为方式可能使这对我来说是一个糟糕的计划?你能想出一种更简单的方法来实现我所描述的吗?

提前致谢!

选择 * 从 (
  选择
    # 来自 t1 的每条记录在最终输出中只能出现一次。
    t1.id,t1.field2,t1.field3,t1.field4,
    # 有多个 t2 记录(每个都有不同的值和优先级)
    # 与每个 t1 记录相关联。
    t2.id AS t2_id, t2.field5, t2.field6, t2.priority
  从 t1
    在 t1.id = t2.t1_id 上加入 t2
    { 其他几个连接 }
  WHERE {很多条件}
  ORDER BY t2.priority ) t
GROUP BY t.priority
4

2 回答 2

3

这根本不可靠。DBMS 没有指定将在所述情况下返回的行。多说一句,这只是 MySQL 的特性,在普通 SQL 中这将是无效的 - 混合非组列和组函数。可以在手册页中找到有关此行为的进一步说明:

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

于 2013-10-10T15:20:21.407 回答
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 }

(我假设 (t1.id, priority) 在 t2 中只有一行)

希望能帮助到你!

于 2013-10-10T15:53:57.473 回答