mysql变量,计算值为@variables

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为

我有一个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次,而不是子查询。我宁愿避免使用子查询,因为我认为即使在当前的形式下,查询也不那么可读

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这样更简单的算法?