Mysql 依靠order by in group语句是否安全?

Mysql 依靠order by in group语句是否安全?,mysql,sql,Mysql,Sql,给出这样一张表: id; day; daily 1; 2013-07-01; 50.00 1; 2013-07-02; 60.00 1; 2013-07-03; 70.00 1; 2013-07-04; 80.00 此查询: SELECT id day, daily, SUM(daily) total FROM table GROUP BY id ORDER BY day DESC 返回: 1; 2013-07-04; 80.00; 260.00

给出这样一张表:

id; day; daily
1; 2013-07-01; 50.00
1; 2013-07-02; 60.00
1; 2013-07-03; 70.00
1; 2013-07-04; 80.00
此查询:

SELECT
   id
   day,
   daily,
   SUM(daily) total
FROM
   table
GROUP BY
   id
ORDER BY
   day DESC
返回:

1; 2013-07-04; 80.00; 260.00
到目前为止一切都很好

我的问题是:对所有“未推荐”值依赖order by语句安全吗?我需要确保我读取了日期最高的行的“daily”值

谢谢,

彼得


PS我发现有几个线程处理类似的问题,但它们都使用子查询,这在我的例子中是没有选择的

不,依靠这个绝对不安全。事实上,这种构造在逻辑上毫无意义(),MySql仍然允许您这样做的事实是。。。糟糕。以下是手册的摘录:

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


如果要获取最后一行和一个求和,那么只需使用两个单独的查询:一个用于最后一行,另一个用于求和。

不,依赖于此绝对不安全。事实上,这种构造在逻辑上毫无意义(),MySql仍然允许您这样做的事实是。。。糟糕。以下是手册的摘录:

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


如果您想得到最后一行和一个和,那么只需使用两个单独的查询:一个用于最后一行,另一个用于和。

您的查询非常好。它只是做不到你想要的:

SELECT id, day, daily, SUM(daily) total
FROM table
GROUP BY id
ORDER BY day DESC;
字段
day
daily
取自数据中的任意行。排序依据在分组依据之后处理。执行所需操作的正确方法是使用子查询,或使用以下
group\u concat()
/
substring\u index()
方法:

SELECT id, max(day) as day,
       substring_index(group_concat(daily order by day desc), ',', 1) as daily,
       SUM(daily) as total
FROM table
GROUP BY id
ORDER BY day DESC;

这会将
每日
转换为字符串。如果您想将其转换为数字,请将其转换回。

您的查询非常好。它只是做不到你想要的:

SELECT id, day, daily, SUM(daily) total
FROM table
GROUP BY id
ORDER BY day DESC;
字段
day
daily
取自数据中的任意行。排序依据在分组依据之后处理。执行所需操作的正确方法是使用子查询,或使用以下
group\u concat()
/
substring\u index()
方法:

SELECT id, max(day) as day,
       substring_index(group_concat(daily order by day desc), ',', 1) as daily,
       SUM(daily) as total
FROM table
GROUP BY id
ORDER BY day DESC;

这会将
每日
转换为字符串。如果你想要它作为一个数字,就把它转换回来。

你是说你想把
总数
作为一个连续的余额吗?此外,为什么子查询在您的情况下不是一个选项呢?谢谢大家——但从这个问题的意义上说,我想Jon回答得对(谢谢您没有告诉我)。但在我承诺拆分查询之前,我会尝试一下Gordon的方法……你是说你想让
total
成为一个持续的平衡?此外,为什么子查询在您的情况下不是一个选项呢?谢谢大家——但从这个问题的意义上说,我想Jon回答得对(谢谢您没有告诉我)。但在我承诺拆分查询之前,我会尝试一下Gordon的方法……谢谢!唯一奇怪的是,这个查询绝对是在做我想做的事情。。。真遗憾。我想我会问两个问题。谢谢!唯一奇怪的是,这个查询绝对是在做我想做的事情。。。真遗憾。我想我会问两个问题。