mysql变量,计算值为@variables
我有一个mysql查询,其中我需要计算像ROUNDSUMtemp.total_pq这样的值,2次,所以我定义了变量以避免重复它们 但是查询中的第5行在结果中返回了错误的值。@diff_client_partner_qtty的值:=ROUND@partner_qtty_all_runs-@client_qtty_all_runs,2 AS diff_client_partner_qtty在我第一次运行时始终为空,此后始终为84 我问了内部DBA,他说我不应该在这样的查询中使用变量,因为mysql为变量设置值的顺序是不可预测的,因此我可能会得到空值 但是为什么呢?另外,请有人提出另一种方法,我可以避免重写ROUNDSUMtemp.total_pq,2次,而不是子查询。我宁愿避免使用子查询,因为我认为即使在当前的形式下,查询也不那么可读mysql变量,计算值为@variables,mysql,sql,Mysql,Sql,我有一个mysql查询,其中我需要计算像ROUNDSUMtemp.total_pq这样的值,2次,所以我定义了变量以避免重复它们 但是查询中的第5行在结果中返回了错误的值。@diff_client_partner_qtty的值:=ROUND@partner_qtty_all_runs-@client_qtty_all_runs,2 AS diff_client_partner_qtty在我第一次运行时始终为空,此后始终为84 我问了内部DBA,他说我不应该在这样的查询中使用变量,因为mysql为
SELECT temp.dtaccounted AS accounting_period,
@partner_qtty_all_runs := ROUND(SUM(temp.total_pq),2) AS partner_qtty_all_runs,
ROUND(temp.mmq,2) AS mopay_qtty,
@client_qtty_all_runs := ROUND(SUM(temp.total_cq),2) AS client_qtty_all_runs,
@diff_client_partner_qtty := ROUND((@partner_qtty_all_runs - @client_qtty_all_runs), 2) AS diff_client_partner_qtty,
@partner_gtv := ROUND(temp.total_pq_gtv, 2) AS partner_gtv,
@client_gtv := ROUND(temp.total_cq_gtv,2) AS client_gtv,
@diff_client_partner_gtv := ROUND((@partner_gtv - @client_gtv), 2) AS diff_client_partner_gtv,
temp.stariffcurrency AS tariffcurrency,
ROUND(@diff_client_partner_gtv * ffactor, 2) AS diff_client_partner_gtv_eur,
temp.scountry AS country,
temp.spartnererpid AS partner_erp_id,
c.name AS partner_name,
temp.nproducttype AS product,
temp.capping
FROM
(SELECT SUM(npartnerquantity) AS total_pq,
SUM(nmindmaticsquantity) AS mmq,
SUM(nclientquantity) AS total_cq,
SUM(dgrosstariff * npartnerquantity) AS total_pq_gtv,
SUM(dgrosstariff * nclientquantity) AS total_cq_gtv,
nrun,
vb.scountry,
vb.spartnererpid,
dtaccounted,
stariffcurrency,
vb.nproducttype,
cq.bisenabled AS capping
FROM report_table vb,
client_table cq
WHERE vb.accperiod > '2013-12-01'
AND vb.partnerid = cq.partnerid
AND vb.scountry = cq.scountry
AND vb.nproducttype = cq.nproducttype
AND (cq.dtvalidto IS NULL
OR cq.dtvalidto > vb.accperiod)
GROUP BY scountry,
nproducttype,
partnerid,
nrun,
accperiod
) temp,
customer c,
currency_conversion cc
WHERE temp.partnerid = c.erp_id
AND temp.total_pq <> temp.total_cq
AND cc.scurrencyfrom = temp.stariffcurrency
AND cc.scurrencyto = 'EUR'
AND cc.dtrefdate = temp.accperiod
GROUP BY temp.scountry,
temp.partnerid,
c.name,
temp.nproducttype,
temp.accperiod
ORDER BY temp.accperiod,
temp.scountry,
temp.partnerid,
temp.nproducttype,
temp.capping \G;
为什么?就是这样。使用书面语言。然而,这是我第一次看到排序真正起作用的地方,因此这是一个非常有用的例子。谢谢,除了使用子查询外,您是否看到了避免在该查询中重复每个计算值的直接机会?另外,在查询中使用这样的变量是不是一点也不推荐?我的意思是,即使涉及到像a+b这样更简单的算法?