我认为这是一个相对先进的问题,我可能很难问好。所以对任何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
答案 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))
希望它有所帮助!