0

MySQL クエリを使用して、結果の配列を PHP に取得しました。ただし、クエリはサブクエリを使用しているため、サブクエリの値が配列に 2 回表示される可能性がありますが、これは正しくありません。これを止めることができるかどうかを確認するために SQL を見て何年も費やしましたが、まったく成功しませんでした。このエラーを修正するために配列を変更する方が簡単かどうか疑問に思っています。

配列:

    array(436) {
  [0]=>
  array(8) {
    ["id"]=>
    string(2) "75"
    ["subtotal"]=>
    string(8) "168.0000"
    ["invoice_type"]=>
    string(1) "1"
    ["adjustment"]=>
    string(4) "0.00"
    ["totalcost"]=>
    string(8) "168.0000"
  }
  [1]=>
  array(8) {
    ["id"]=>
    string(2) "82"
    ["subtotal"]=>
    string(7) "84.0000"
    ["invoice_type"]=>
    string(1) "1"
    ["adjustment"]=>
    string(4) "0.00"
    ["totalcost"]=>
    string(7) "84.0000"
  }
  [2]=>
  array(8) {
    ["id"]=>
    string(2) "86"
    ["subtotal"]=>
    string(8) "224.0000"
    ["invoice_type"]=>
    string(1) "1"
    ["adjustment"]=>
    string(4) "0.00"
    ["totalcost"]=>
    string(8) "224.0000"
  }
  [3]=>
  array(8) {
    ["id"]=>
    string(2) "95"
    ["subtotal"]=>
    string(7) "70.0000"
    ["invoice_type"]=>
    string(1) "1"
    ["adjustment"]=>
    string(4) "9.00"
    ["totalcost"]=>
    string(7) "70.0000"
  }
  [4]=>
  array(8) {
    ["id"]=>
    string(2) "95"
    ["subtotal"]=>
    string(7) "84.0000"
    ["invoice_type"]=>
    string(1) "2"
    ["adjustment"]=>
    string(4) "9.00"
    ["totalcost"]=>
    string(7) "84.0000"
  }

問題:

SQL では、結果は「invoice_type」、「id」の順にグループ化されます。SQL は、サブクエリを使用して「調整」の値を取得します。結果に「invoice_type = 1」と「invoice_type = 2」がある場合、両方の項目が配列に追加されますが、調整値も両方に追加されますが、2 倍になるので望ましくありません。

「id」が重複しているかどうかを確認する簡単な方法はありますか?重複している場合は、「調整」値の 1 つを 0.00 に設定しますか?

SQL でこれを本当にカバーする必要があると思われる場合は、その部分に関する情報も追加できれば幸いです。

私はこれをあまりにも長い間見つめていて、他のオプションを見ることができません;-)

編集 - SQL:

SELECT tbl_client.id, tbl_client.first_name, tbl_client.surname, tbl_schedule.invoice_type, sum( duration ) AS totalhours, sum( duration * rate ) AS subtotal, ifnull( adjustment.totaladjustment, 0 ) AS adjustment, (
sum( duration * rate ) + ifnull( adjustment.totaladjustment, 0 )
) AS totalcost
FROM `tbl_schedule`
INNER JOIN tbl_client ON tbl_client.id = tbl_schedule.client
LEFT JOIN (
    SELECT client, sum( amount ) AS totaladjustment
    FROM tbl_invoice_adjustment
    WHERE ( tbl_invoice_adjustment.`date` BETWEEN 1357002061 AND 1359676740 )
    GROUP BY client
    ) adjustment ON adjustment.client = tbl_schedule.client
WHERE tbl_schedule.franchise =1
AND ( STATUS =1 OR `status` =2 OR `status` =4 )
AND `date` BETWEEN 1357002061 AND 1359676740
GROUP BY tbl_schedule.invoice_type, tbl_schedule.client
ORDER BY tbl_client.surname ASC

編集 - テーブル構造

tbl_client

id
フランチャイズ
タイトル

first_name

tbl_schedule

id
フランチャイズ
日付
クライアント
invoice_type
期間

ステータス

tbl_invoice_adjustment

id
フランチャイズ
クライアント
日付
説明
金額

アイデアは、クエリが特定の期間の調整を取得し、それらをスケジュール値と組み合わせる必要があるということです。この調整の実装を開始するまでは、すべて順調でした。1 つの期間に特定のクライアントに対して複数の「invoice_type」エントリが存在するまれなケースを除いて、99.7% OK です。

編集: - SQL フィドル

これが問題のSQL Fiddleです。

ステートメントを実行すると、クライアント ID 5 に調整が 2 回与えられていることがわかりますが、データベースにはクライアントの調整が 1 つしかありません。グループ化はinvoice_typeによるため、メインのクエリには2つの行が表示されます。各結果行はサブクエリを実行し、調整を取得します。

フィドルは必要な出力を示していますが、ステートメントはまったく修正されていません。

4

1 に答える 1

0

PHPメソッドを使用してこれを修正し、必要に応じて変更を加えて配列を実行しました。私のニーズに完全に対応しています。

 $showerror = false;
    $lineid = array();
    foreach ($empresults as $invoiceline => $line) {
        if (isset($lineid[$line['id']])) {
            $empresults[$invoiceline]['duplicate'] = true;
            $empresults[$lineid[$line['id']]]['duplicate'] = true;
            if ($empresults[$lineid[$line['id']]]['adjustment'] != 0) {
                $empresults[$lineid[$line['id']]]['totalcost'] = $empresults[$lineid[$line['id']]]['totalcost'] - $empresults[$lineid[$line['id']]]['adjustment'];
                $empresults[$lineid[$line['id']]]['adjustment'] = 0;
            }
            $showerror = true;
        } else {
            $empresults[$invoiceline]['duplicate'] = false;
        }
        $lineid[$line['id']] = $invoiceline;
    }
于 2013-10-03T11:30:35.157 に答える