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

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

我认为这是一个比较高级的问题,我可能很难问好。所以提前为任何胡言乱语表示歉意。

我喜欢Mysql的分组功能。 MIN()、MAX() 等可以轻松地按某个公因数对行进行分组,然后获取每个分组行池的显着特征。但我问的问题与我不希望发生这种行为的情况有关;相反,在特定情况下,我想确保当我将一组(假设 10)行分组为一行时,对于行与行之间不同的任何值,结果分组行中显示的所有值均源自相同的预分组行。我的问题:这可能吗?有需要注意的坑洼吗?

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

根据我的实验,嵌套查询似乎应该能够做到这一点,我先订购,然后再分组。 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

最佳答案

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

However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. Sorting of the result set occurs after values have been chosen, and ORDER BY does not affect which values within each group the server chooses.

关于Mysql:行分组时提供的值有多可靠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299704/

相关文章:

mysql - 如何使用一个 SQL 查询通过多个联接获取多个计数?

mysql - 按日期计数和分组应在没有值时返回 0

mysql - 使用 group by 从连接表中获取最大日期

mysql - 如何通过本地 Linux 机器截断(删除所有行)远程 SQL 服务器上的表

sql - 如何在 SQL 查询中选择静态字符串并确保其类型为 VARCHAR2?

php - 我怎样才能用 html 和 php 安排我的表格

sql - 使用不同列的不同可选值更新多行

mysql - 用值填充 LEFT JOIN 中的 NULL

mysql - 使用 INNER JOIN 更新的查询语法错误

mysql - MySQL 中有太多未知写入