MySQL:使用复杂的等式从多个表中生成计算列

时间:2015-04-14 21:12:08

标签: php mysql equation

我在PHP中编写了一个公式,它使用来自不同表的字段来计算百分比。我想尝试和完成的是将其转换为SQL,如果可能的话。

我知道我可以使用SET来制作局部变量,然后选择该变量显示在我的最终表中,但将这些变量设置为方程式会给我带来一些麻烦。

这是PHP。我试图让它尽可能简单而不会混淆。

/*Setting fields to variables for ease*/
$PU = {table1.PU}*60;
$PD = {table1.PD};
$UD = {table3.UD};
$GP = {table1.GP};
$S = {table2.S};
$R = {table4.R};
$PR = {table1.CT}/60;

/*Combining variables*/
$TRT = $PU - $PD - $UD;
$PT = $TRT * $PR;
$TP = $GP + $S + $R;


/*Checking and correcting for zero division plus final calculation*/
if ($PU == 0 || $PT == 0 || $TP == 0){
    {complete} = "Error!";
}
else {
$a = $TRT/$PU;
$b = $TP/$PT;
$c = $GP/$TP;
{complete} = 100 * ($a * $b * $c);
}

MySQL我已经开始了。我的攻击计划是使用列名称将公式分配给变量,包括检查零分割。通过SQL Maestro运行此命令,在无效的SET令牌上给出错误。我试过用双引号包装整个东西(并检查@variable $ variable,=,= =所有没有运气)并检查了几个来源,我的SET命令应该是正确的。我的私钥和外键设置正确。

SET @a = (((table1.PU*60) - table1.PD - table3.UD) / (table1.PU*60));
SET @b = (table1.GP + table2.S + table4.R)/(((table1.PU*60) - table1.PD - table3.UPD)*(table1.CT/60));
SET @c = table1.GP/(table1.GP + table2.S + table4.R);
SET @complete = 100*(@a*@b*@c);

IF(table1.PU = 0, 'Error!',@a),
IF(table1.CT = 0, 'Error!',@p),

SELECT
  table1.PU,
  table1.PD,
  table1.CT,
  table2.S,
  table3.UD,
  table4.R,
  @complete
FROM
  table1
  LEFT JOIN table2
  LEFT JOIN table3
  LEFT JOIN table4

我要查找的最终结果是显示我选择的所有单个字段以及计算字段。我已经调查了PROCEDURE,我认为这可能是有益的,但我不确定如何将其完全合并。

2 个答案:

答案 0 :(得分:0)

我认为SET仅适用于选择查询:How to set variable from a SQL query?

此外,我假设table1-4只包含一行。否则,SET不起作用。

SET @a = (SELECT 
           (((table1.PU*60) - table1.PD - table3.UPD) / (table1.PU*60)) 
          FROM table1, table3);
SET @b = (SELECT 
           (table1.GP + table2.S + table4.R)/(((table1.PU*60) - table1.PD - table3.UPD)*(table1.CT/60)) 
          FROM table1, table2, table3, table4);
SET @c = (SELECT 
           table1.GP/(table1.GP + table2.S + table4.R) 
          FROM table1, table2, table4);
SET @complete = 100*(@a*@b*@c);

IF(table1.PU = 0, 'Error!',@a),
IF(table1.CT = 0, 'Error!',@p),

SELECT
    table1.PU,
    table1.PD,
    table1.CT,
    table2.S,
    table3.UPD,
    table4.R,
    @complete // or perhaps (SELECT @complete as complete)
FROM
  table1, table2, table3, table4

答案 1 :(得分:0)

你不需要SET。这是一个简单的SELECT,可以进行所有计算:

SELECT
    table1.PU * 60 AS PU,
    table1.PD AS PD,
    table3.UPD AS UPD,
    table1.GP AS GP,
    table2.S AS S,
    table4.R AS R,
    table1.CT/60 AS PR,
    (table1.PU * 60) - table1.PD - table3.UPD AS TRT,
    (table1.PU * 60 - table1.PD - table3.UPD) * (table1.CT/60) AS PT,
    table1.GP + table2.S + table4.R AS TP,
    ((table1.PU * 60) - table1.PD - table3.UPD) / (table1.PU * 60) AS a,
    (table1.GP + table2.S + table4.R) / ((table1.PU * 60 - table1.PD - table3.UPD) * (table1.CT/60)) AS b,
    table1.GP / (table1.GP + table2.S + table4.R) AS c,
    100 * (((table1.PU * 60) - table1.PD - table3.UPD) / (table1.PU * 60)) * ((table1.GP + table2.S + table4.R) / ((table1.PU * 60 - table1.PD - table3.UPD) * (table1.CT/60))) * (table1.GP / (table1.GP + table2.S + table4.R)) AS complete
FROM
    table1,
    table2,
    table3,
    table4

假设您的所有表只包含一行。否则,您需要指定一些JOIN条件。