gpt4 book ai didi

mysql - 当您必须在许多查询中使用派生列时,创建表是否更好?

转载 作者:行者123 更新时间:2023-11-29 16:10:21 25 4
gpt4 key购买 nike

我有一些查询要做,但最终使用了太多子查询。其中一个子查询是查找通过对两列求和得出的派生值。所以我想如果我把这个派生列做成一个表,它会减少子查询的数量。

这是简化的代码:

   with temp as(
select user_id,games_id,sum(case when buy_in IS NULL then cash_out end)-sum(case when cash_out is NULL then buy_in end) as total
from game_history
group by games_id, user_id
)
select count(*) as cnt
from (select user_id,games_id, total,SUM(CASE WHEN total <0 THEN 1 END) OVER (PARTITION BY user_id ORDER BY games_id ROWS UNBOUNDED PRECEDING) as sumNo
from temp
)a
where total>0
group by user_id,sumNo;

我使用了临时表,但仍然有一个子查询。那么,如果该列 total 应该是一个表格,会更好吗?如果是,我该怎么做?

这是我试图更改的代码:

  select count(*) as count
from( select user_id,games_id,total, SUM(CASE WHEN total <0 THEN 1 END) OVER (PARTITION BY user_id ORDER BY games_id ROWS UNBOUNDED PRECEDING) AS sumNo
from(
select user_id,games_id,sum(case when buy_in IS NULL then cash_out end)-sum(case when cash_out is NULL then buy_in end) as total
from game_history
group by games_id, user_id
)a) b
WHERE total>0
GROUP BY user_id, sumNo;

我读到最好使用联接而不是子查询,但我不知道这是否适用于仅使用一个表中的属性的查询。

HERE'S THE TABLE STRUCTURE而且由于所有 NULL 值,如果我创建两个表,一个用于 buy_in,一个用于 cash_out,效果会更好。

我使用的是 mysql 8.0。

最佳答案

一些需要澄清的语言项目 -
第一个代码片段使用名为 temp 的 CTE(公共(public)表表达式)和一个派生表。第二个代码片段使用 2 个派生表。

如果正在编写的查询位于仅用于检查数据的脚本中,并且不会在生产中使用,则可以在脚本顶部为当前逻辑创建一个临时表在派生表中,并通过连接写入后续查询到临时表。

如果正在编写的查询将合并到生产中,则可以创建一个 View ,其中包含当前位于派生表中并用于连接其他查询的逻辑。

关于表结构-
一种方法是稍微修改现有的表。添加一个 amount_type 列和另一个 amount 列(或任何有意义的列名称)。 amount_type 列将填充表示“买入”或“兑现”的值,而 amount 列将保存该数字。然后,在数据移至新列后,现有表中的 buy_incash_out 列将被删除。以下是修改后的表格包含几行数据的屏幕截图:
enter image description here
此结构还应有助于简化查询。

关于mysql - 当您必须在许多查询中使用派生列时,创建表是否更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55318323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com