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つの行が表示されます。各結果行はサブクエリを実行し、調整を取得します。
フィドルは必要な出力を示していますが、ステートメントはまったく修正されていません。