mysql如何选择,通常在哪里工作,以及在添加列时如何工作?

mysql如何选择,通常在哪里工作,以及在添加列时如何工作?,mysql,Mysql,我是mysql的新手,我不知道术语,所以我会尽可能地说。我的问题是: 我有一个works表,它有几个列:id、date和done 我想用一个名为cumulative_done的新列+1来选择它们。我使用这个sql命令来获得我想要的结果 SET @cdone := 0; SELECT *, (@cdone := @cdone + done) as cummulative_done FROM works; 结果: +----+---------------------+------+-------

我是mysql的新手,我不知道术语,所以我会尽可能地说。我的问题是:

我有一个works表,它有几个列:id、date和done

我想用一个名为cumulative_done的新列+1来选择它们。我使用这个sql命令来获得我想要的结果

SET @cdone := 0;
SELECT *, (@cdone := @cdone + done) as cummulative_done
FROM works;
结果:

+----+---------------------+------+------------------+
| id |        date         | done | cummulative_done |
+----+---------------------+------+------------------+
|  1 | 2020-05-01 14:22:34 |   10 |               10 |
|  2 | 2020-05-02 14:22:45 |   50 |               60 |
|  3 | 2020-05-03 14:23:00 |   30 |               90 |
|  4 | 2020-05-04 14:23:13 |  100 |              190 |
|  5 | 2020-05-05 14:23:24 |   25 |              215 |
+----+---------------------+------+------------------+
然后,我希望通过使用SQLWHERE完成的累积计算来过滤该结果。在我第一次尝试时,我使用了这个sql命令

SET @cdone := 0;
SELECT *, (@cdone := @cdone + done) as cummulative_done
FROM works
WHERE cummulative_done <= 100;
SET @cdone := 0;
SELECT *, (@cdone := @cdone + done) as cummulative_done
FROM works
WHERE @cdone + done <= 100;
结果是:

+----+---------------------+------+------------------+
| id |        date         | done | cummulative_done |
+----+---------------------+------+------------------+
|  1 | 2020-05-01 14:22:34 |   10 |               10 |
|  2 | 2020-05-02 14:22:45 |   50 |               60 |
|  3 | 2020-05-03 14:23:00 |   30 |               90 |
+----+---------------------+------+------------------+
它给了我想要的结果,但我不明白为什么它有效,为什么我的无效

从那以后,我认识到我对sql SELECT的理解以及哪里错了。有人能给我解释一下sql选择是如何工作的吗?之后,请解释为什么我的第一次尝试不起作用,以及为什么解决方案起作用


如果可以的话,我更喜欢循序渐进或深入的解释,但仍然容易理解。谢谢。

查看MySQL语句的执行顺序。在选择之前执行WHERE,因此不能按稍后定义的列进行筛选

更多信息:

下一行变量@cdone的每次迭代都会随着前一行的值的增加而增加,这样条件就适用于结果。对于WHERE/SELECT的每一行,执行顺序保持不变,但对每一行逐个执行

WHERE子句(如果给定)表示 行必须满足以下条件才能被选择。其中,_条件是一个表达式 对于要选择的每一行,其计算结果为true。声明 如果没有WHERE子句,则选择所有行

您可以修改代码

SET @cdone := 0;
SELECT *, @cdone as cummulative_done
FROM works
WHERE (@cdone := @cdone + done) <= 100;

查看MySQL语句的执行顺序。在选择之前执行WHERE,因此不能按稍后定义的列进行筛选

更多信息:

下一行变量@cdone的每次迭代都会随着前一行的值的增加而增加,这样条件就适用于结果。对于WHERE/SELECT的每一行,执行顺序保持不变,但对每一行逐个执行

WHERE子句(如果给定)表示 行必须满足以下条件才能被选择。其中,_条件是一个表达式 对于要选择的每一行,其计算结果为true。声明 如果没有WHERE子句,则选择所有行

您可以修改代码

SET @cdone := 0;
SELECT *, @cdone as cummulative_done
FROM works
WHERE (@cdone := @cdone + done) <= 100;

请尝试搜索sql操作顺序和mysql操作顺序以获取详细信息。例如,尝试搜索sql操作顺序和mysql操作顺序,以获得洞察。例如,我理解为什么我的第一次尝试不起作用,因为WHERE在SELECT之前执行。那么,为什么@cdone会在何处自动递增呢?在@cdone:=@cdone+done中,SELECT上是否存在自动增量的语法。我仍然对此感到困惑。@cdone的每一行值都会随着SELECT中的done而增加,所以WHERE中的条件也会发生变化。嗯。。。你不是说先去哪里,然后再选吗?然后你说,“@cdone的每一行值都会随着SELECT中的done而增加,所以WHERE中的条件也会改变。”为什么?为什么第一个执行的位置也会改变?我修改了我的答案。对于WHERE/SELECT的每一行,执行顺序保持不变,但对每一行逐个执行。所以它执行第一行的WHERE,然后选择第一行的WHERE,然后选择第二行的WHERE,然后选择第二行的WHERE等等。这是一个简化的解释,我跳过了其他操作。好的,我理解为什么我的第一次尝试不起作用,因为WHERE是在选择之前执行的。那么,为什么@cdone会在何处自动递增呢?在@cdone:=@cdone+done中,SELECT上是否存在自动增量的语法。我仍然对此感到困惑。@cdone的每一行值都会随着SELECT中的done而增加,所以WHERE中的条件也会发生变化。嗯。。。你不是说先去哪里,然后再选吗?然后你说,“@cdone的每一行值都会随着SELECT中的done而增加,所以WHERE中的条件也会改变。”为什么?为什么第一个执行的位置也会改变?我修改了我的答案。对于WHERE/SELECT的每一行,执行顺序保持不变,但对每一行逐个执行。所以它执行第一行的WHERE,然后选择第一行的WHERE,然后选择第二行的WHERE,然后选择第二行的WHERE等等。这是一个简化的解释,我跳过了其他操作。