mysql - mysql SELECT 和 WHERE 通常如何工作以及添加列时如何工作?
问题描述
我是 mysql 的新手,我不知道术语,所以我会尽量说话。这是我的问题:
我有works
表,它有列:id
、、date
和done
。
+----+---------------------+------+
| id | date | done |
+----+---------------------+------+
| 1 | 2020-05-01 14:22:34 | 10 |
| 2 | 2020-05-02 14:22:45 | 50 |
| 3 | 2020-05-03 14:23:00 | 30 |
| 4 | 2020-05-04 14:23:13 | 100 |
| 5 | 2020-05-05 14:23:24 | 25 |
+----+---------------------+------+
我想用 +1 新列选择所有这些,命名为cummulative_done
. 我使用这个 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 |
+----+---------------------+------+------------------+
然后,我希望cummulative_done
使用 sql过滤该结果WHERE
。在我第一次尝试时,我使用了这个 sql 命令。
SET @cdone := 0;
SELECT *, (@cdone := @cdone + done) as cummulative_done
FROM works
WHERE cummulative_done <= 100;
它给了我错误:Error in query (1054): Unknown column 'cummulative_done' in 'where clause'
。
之后,我在谷歌上搜索并使用此 sql 命令得到了解决方案。
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
是WHERE
错误的。谁能向我解释一下 sqlSELECT
和WHERE
一般是如何工作的?之后,请解释为什么我的第一次尝试不起作用以及解决方案为何起作用。
如果可以,我更喜欢step-by-step
或deep
解释,但仍然easy to understand
。谢谢。
解决方案
查看 MySQL 语句的执行顺序。WHERE
之前执行,SELECT
因此您无法按稍后定义的列进行过滤。
更多信息: MySQL 查询/子句执行顺序
下一行变量的每次迭代都会随着前一行@cdone
的值而增加,done
因此该条件适用于结果。对于每一行的WHERE
/SELECT
执行顺序保持不变,但对每一行逐一执行。
WHERE 子句(如果给定)指示行必须满足才能被选择的一个或多个条件。where_condition 是一个表达式,对于要选择的每一行计算结果为真。如果没有 WHERE 子句,该语句将选择所有行。
您可以修改您的代码。
SET @cdone := 0;
SELECT *, @cdone as cummulative_done
FROM works
WHERE (@cdone := @cdone + done) <= 100;
推荐阅读
- python - 具有虚拟环境的 WSGI 应用程序中的 ImportError
- django - 如何与父级一起显示多个相关的外键
- angular - 没有使用 Angular Bootstrap 的 NgbDropdown 提供程序
- r - 时间序列数据分析
- javascript - AngularJS ng-messages在有效输入/缩小后没有隐藏 - 捆绑
- java - Spring WebExceptionHandler 顺序
- python - 在 Python 中安全地覆盖和擦除文件
- rust - 在 Rust 的多个向量中拥有一个结构实例
- javascript - ReactJs中Antd Carousel上的TSLint错误“属性'carousel'不存在”
- tabulator - 在制表符变异器中保存样式