我有一个使用变量来生成计数器的 MySQL 查询:
select
zz.work_order,
zz.op_number,
@num := if(@wo = zz.work_order, @num+1,1) as 'steps_away',
@wo := zz.work_order as 'dummyWO'
from
(
select
w.work_order,
w.op_number
from
[sql cut]
order by
w.work_order asc,
r.op_number asc
) as zz
当我在 MySQL 工作台中执行此操作时,steps_away 已正确填充。 第一次出现工作订单时,steps_away = 1,下一次出现时,steps_away = 2,依此类推,直到看到新的工作订单并且计数器重置。
在 Python 中,我使用 pandas read_sql 和 to_sql 函数将查询保存在 DataFrame 中,然后将其发送到数据库。
df = pd.read_sql(sql_cmd, engine)
无论我使用 df.to_csv 将此 df 发送到 csv 还是使用 df.to_sql 发送到表,steps_away 列的值始终为 1。
什么可能导致查询在直接在 MySQL 中运行时与在 Python 中调用时看起来正确?
更新
我对此进行了更多测试,发现了一些奇怪的事情。当我再次在 MySQL Workbench 中尝试查询时,steps_away 中的值全部(错误地)等于 1。我立即重新运行查询,没有任何更改,然后值被正确填充。
我在 Python 中添加了两次 pd.read_sql 行,以匹配我手动执行的操作,并且 DataFrame 现在具有 steps_away 的正确值。在查询中使用此计数器会导致这种行为,有时有效,有时无效,并且似乎调用查询两次可以确保计数器列正确填充,这是怎么回事?
最佳答案
看起来这都是与 MySQL 相关的,与 python 无关。 需要首先将变量设置为值来初始化变量。在 from 部分的另一个子查询中执行此操作,问题得到解决。
select
zz.work_order,
zz.op_number,
@num := if(@wo = zz.work_order, @num+1,1) as 'steps_away',
@wo := zz.work_order as 'dummyWO'
from
(
select
w.work_order,
w.op_number
from
[sql cut]
order by
w.work_order asc,
r.op_number asc
) as zz,
(
select
@num:=0,
@wo:=''
) as r
关于python - 使用 Python 和 pandas 无法正确填充 MySQL 计数器列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39838143/