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