SELECT @total := SUM(price) FROM orders WHERE status = 'paid'; -- 将已支付订单的总价值暂存到@total变量中 SELECT *, @total as total_price FROM orders WHERE price > @total * 0.8; -- 获取订单列表,并将@total变量的值作为total_price列返回如何改为子查询
时间: 2024-02-11 08:06:59 浏览: 30
可以将第一个查询作为子查询嵌入到第二个查询中,如下所示:
```
SELECT *, (SELECT SUM(price) FROM orders WHERE status = 'paid') as total_price
FROM orders
WHERE price > (SELECT SUM(price) FROM orders WHERE status = 'paid') * 0.8;
```
这样就可以避免使用变量,并且将两个查询合并为一个查询语句。
相关问题
为什么 select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r where approverEuid = 'EU000000073' ORDER BY id, approverEuid,startDate,enddate) t; 和 select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r ORDER BY id, approverEuid,startDate,enddate) t where t.approverEuid = 'EU000000073'; 的排序结果不相同
这是由于 MySQL 的执行顺序导致的结果不同。
在第一个查询中,子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 是在筛选条件 `where approverEuid = 'EU000000073'` 之前执行的。这意味着在子查询中变量 `@num` 的值会在进行筛选操作之前递增。
而在第二个查询中,子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 是在整个结果集上执行的。这意味着变量 `@num` 的值会在排序操作之前递增。
由于递增操作的不同时机,这两个查询的结果集中的 `listsort` 列的排序值可能会不同,进而导致最终结果的顺序不同。
如果你希望两个查询的排序结果相同,你可以尝试将子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 移动到主查询之前,以确保变量在排序操作之前被正确初始化。或者,你也可以在两个查询中都加上筛选条件 `where approverEuid = 'EU000000073'`,以确保只返回特定的 `approverEuid` 的行并进行排序。
select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r /*where approverEuid = 'EU000000073'*/ ORDER BY id, approverEuid,startDate,enddate) t where t.approverEuid = 'EU000000073'; 和 select t.* from (SELECT IF(@a = convert(approverEuid using utf8) and @b = IFNULL(convert(startDate using utf8),'9999-99-99') and @c = IFNULL(convert(endDate using utf8),'9999-99-99') , @num := @num + 1, @num := 1) -1 AS listsort, @a := approverEuid, @b := IFNULL(startDate,'9999-99-99'), @c := IFNULL(endDate,'9999-99-99'), id, approverEuid,startDate,enddate FROM ga_mid.approver t , (SELECT @num := 0, @a := '',@b := '', @c := '') r ORDER BY id, approverEuid,startDate,enddate) t where t.approverEuid = 'EU000000073'; 的区别
这两个查询之间的区别在于子查询的位置不同。
在第一个查询中,子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 位于 `FROM` 子句中的表 `ga_mid.approver t` 的后面。
而在第二个查询中,子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 位于 `FROM` 子句中的表 `ga_mid.approver t` 的前面。
这个子查询的目的是初始化变量 `@num`、`@a`、`@b`、`@c`。这些变量在主查询中用于记录前一行的值,并在每一行进行比较,以确定是否需要递增 `@num`。
由于 MySQL 的执行顺序,子查询中的变量初始化操作会在主查询之前执行。因此,第一个查询中的子查询会在主查询之前初始化变量,而第二个查询中的子查询会在主查询之后初始化变量。
这种不同的初始化时机可能会导致结果集的排序不同,因为排序所依赖的变量值可能会受到初始化时机的影响。因此,这两个查询的结果可能是不同的。
如果你希望得到相同的排序结果,请将子查询 `(SELECT @num := 0, @a := '',@b := '', @c := '') r` 放在主查询之前,以确保变量在主查询之前被正确初始化。
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)