如果在比较中使用列,MySQL是否使用该列中的第一个值?

如果在比较中使用列,MySQL是否使用该列中的第一个值?,mysql,sql,standards,Mysql,Sql,Standards,我已经知道下面的SQL代码很糟糕,但编写它会带来一个关于MySQL如何处理比较中的列的问题 该任务是确定在两个给定日期之间销售最多产品数量的品牌。以下代码在内部查询中使用ORDER BY生成正确的答案注释: Select SUB.Brand_id, SUB.Brand_name, SUB.Brand_Type, SUB.Total <p> FROM ( Select Brand_id, Brand_name, Brand_Type, SUM(line_qty) AS Tota

我已经知道下面的SQL代码很糟糕,但编写它会带来一个关于MySQL如何处理比较中的列的问题

该任务是确定在两个给定日期之间销售最多产品数量的品牌。以下代码在内部查询中使用ORDER BY生成正确的答案注释:

Select SUB.Brand_id, SUB.Brand_name, SUB.Brand_Type, SUB.Total <p>
FROM
(
    Select Brand_id, Brand_name, Brand_Type, SUM(line_qty) AS Total
    FROM LGLINE 
    NATURAL JOIN LGINVOICE 
    NATURAL JOIN LGPRODUCT 
    NATURAL JOIN LGBRAND
    Where INV_Date Between '2011-11-01' AND '2011-12-05'
    Group by Brand_name
    Order by Total DESC   -- Note the order by in the subquery
) as SUB
HAVING (MAX(SUB.TOTAL) = SUB.Total);
这将生成一条记录,这是正确的答案:

“30”、“长途”、“承包商”、“590”

相比之下,缺少子查询顺序By的以下代码不会产生任何结果:

Select SUB.Brand_id, SUB.Brand_name, SUB.Brand_Type, SUB.Total <p>
FROM
(
    Select Brand_id, Brand_name, Brand_Type, SUM(line_qty) AS Total
    FROM LGLINE 
    NATURAL JOIN LGINVOICE 
    NATURAL JOIN LGPRODUCT 
    NATURAL JOIN LGBRAND
    Where INV_Date Between '2011-11-01' AND '2011-12-05'
    Group by Brand_name
    -- Order by Total DESC.    NOTE: I have commented out this line
) as SUB
HAVING (MAX(SUB.TOTAL) = SUB.Total);
我怀疑MySQL正在将等号后的SUB.Total解释为SUB.Total列中的第一个值。问题分两部分:

我可以用MySQL来证实我的怀疑吗?有没有办法用解释或其他语句来帮助你

如果我的怀疑是正确的,这似乎是一个相当武断的设计决定。我希望会有一个错误。是否有任何SQL文档说明这是正确的或不正确的行为


注意,这主要是一个学术问题,因为我可以重写查询并完成它。然而,我对MySQL的工作原理很感兴趣。

您偶然发现了MySQL的非标准分组支持

mysql> SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+
10 rows in set (0.00 sec)

mysql> SELECT * FROM ints HAVING i > 7;
+---+
| i |
+---+
| 8 |
| 9 |
+---+
2 rows in set (0.00 sec)

mysql> SELECT 1 FROM ints HAVING i > 7;
ERROR 1054 (42S22): Unknown column 'i' in 'having clause'
mysql>
与其他所有数据库AFAIK不同,mysql允许您不列出GROUPBY子句中的所有非聚合列。当其他数据库抛出语法异常时,mysql会为GROUPBY子句中列出的每一个唯一的列组合返回一行

根据文档,为每个组返回的行是随机选择的,但是出于实用性考虑,它始终是遇到的第一行。也就是说,如果在应用group by之前使用内部查询对行进行排序,则将从已排序的行中获取第一行。这种情况100%都会发生,没有任何例外

我个人完全可以放心地依赖这种行为,但其他人更喜欢肛门,拒绝使用这种非常方便的行为

是否列出了所有非聚合列,如下所示:

GROUP BY Brand_id, Brand_name, Brand_Type

你会得到你期望的正确结果。

我想你可以自己测试一下,比问问题更快。你不能删除这样的内容。人们已经回答了这个问题。破坏你的问题会使他们的答案无效。如果你不想上网,你不应该问这个问题。通过在此处发布,您已经不可撤销地永久许可了该网站的内容。请把它放在原处。如图所示的设置没有任何意义,因为它被应用于一个不使用group by的查询——这本质上是非法的SQL,只有MySQL选择返回随机数据而不是抛出错误:好吧,无论如何,到目前为止——但我在另一个阵营-@我是这样看待它的:改变这种行为的唯一方法是升级到mysql,这将在测试服务器上进行测试,所有的回归测试在升级到其他任何地方之前都会完成,所以任何改变都会被检测到,查询会在影响任何系统之前被重新处理。但是,如果没有证据证明这些查询是必要的,那么为什么还要做额外的工作呢?更有可能的是,a它永远不会发生,b规范将被更改为正式声明返回遇到的第一行