-2
     function sum($nomId){
    $sql = "SELECT SUM(nomDetCantidad) FROM table2 where Id = $nomId";
$Resultado=$this->ProcesaSQLQueryList($sql);
if($Resultado>0){
foreach($Resultado as $key => $valor){
$cantidadTotal = $valor[0];
}
}
if($Resultado=='null'){$cantidadTotal=0;}
$sql = "UPDATE table1 SET nomCantidadTotal=$cantidadTotal,nomActualizado = NOW() WHERE nomId= $nomId";
return $this->ProcesaSQLQueryUpdate($sql);

これが私が呼び出す関数です

      function ProcesaSQLQueryList($SQLQuery){

        $row= array();
        if(!$this->link_mysql) $this->link_mysql = conectarManager();
        if($res = mysql_query($SQLQuery,$this->link_mysql)){

            while($r = mysql_fetch_array($res)){
                $row[] = $r;
            }
            mysql_free_result($res);
            return $row;
        }else{
            $this->last_error = $SQLQuery . " - " . mysql_error();  
            return -1;
        }
    }

したがって、テーブル1の外部キーを使用してフィールドテーブル2にあるものをすべて合計すると、結果はテーブル1フィールドに更新されますが、テーブル2のフィールドを削除すると、結果は0に更新されません。これは確かに簡単ですが、見つけられないようです

4

2 に答える 2

1
$sql = "SELECT SUM(nomDetCantidad) FROM table2 where nominaId = $nomId";
$Resultado = $this->ProcesaSQLQueryList($sql);

if ($Resultado > 0) {
    foreach ($Resultado as $key => $valor) {
        $cantidadTotal = $valor[0];
    }
}

if ($cantidadTotal == '') {
    $cantidadTotal=0.00;
}

$sql = "UPDATE table1 SET nomCantidadTotal=$cantidadTotal,nomActualizado = NOW() WHERE nomId = $nomId";

return $this->ProcesaSQLQueryUpdate($sql);

そこには!空の変数 xD が送られてきましたが、修正されました。もっと適切な方法があります。Spencer に同意しますが、クライアントが赤いスイングをしたい場合は、赤いスイングを取得する必要があります。:) 助けてくれてありがとう!

于 2012-07-12T17:06:52.087 に答える
1

table2 に「一致する」行がない場合にゼロを返す必要がある場合は、戻り式を IFNULL 関数でラップします。

SELECT IFNULL(SUM(nomDetCantidad),0) FROM table2 ... 

このすべての作業を 1 つの UPDATE ステートメントで実行することにより、コードの量を大幅に削減し、データベースへのラウンドトリップの回数を減らし、パフォーマンスを向上させることができます。相関サブクエリまたは OUTER JOIN のいずれかを使用できます。

-- 相関サブクエリを使用する

 UPDATE table t1
    SET t1.nomActualizado = NOW()
      , t1.nomCantidadTotal = 
        ( SELECT IFNULL(SUM(t2.nomDetCantidad),0) AS nomCantidadTotal
            FROM table2 t2
           WHERE t2.Id = t1.nomID
        )
  WHERE t1.nomId = $nomId

-- OUTER JOIN の使用

 UPDATE table1 t1
   LEFT
   JOIN (SELECT t2.Id, SUM(t2.nomDetCantidad) AS nomCantidadTotal
           FROM table2 t2
          WHERE t2.Id = $nomId
          GROUP BY t2.Id
        ) s
     ON s.Id = t1.nomID
    SET t1.nomCantidadTotal = IFNULL(s.nomCantidadTotal,0)
      , t1.nomActualizado = NOW()
  WHERE t1.nomID = $nomId

この合計を table1 に保存する必要がある理由はまったく明確ではありません。必要なときにいつでも table2 から値を取得でき、その値を table1 に保存する必要はありません...

SELECT t1.nomId
     , IFNULL((SELECT SUM(t2.nomDetCantidad) AS nomCantidadTotal
                FROM table2 t2
               WHERE t2.Id = t1.nomID
       ),0) AS nomCantidadTotal
  FROM table1 t1
 WHERE t1.nomId = $nomId
于 2012-07-11T18:27:37.880 に答える