由于子查询,MySQL结果中的PHP数组具有重复值

时间:2013-09-24 14:48:52

标签: php mysql sql arrays

我使用MySQL查询将结果数组导入PHP。但是,查询使用子查询,并且可能导致子查询值在数组中显示两次,这是不正确的。我花了很多年的时间看着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”AND“invoice_type = 2”,则两个项目都会添加到数组中,但调整值也会添加到我不想要的两个项目中,因为它会加倍。

是否有一种简单的方法可以查看“id”是否重复,如果是,请将其中一个“调整”值设置为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
专营
客户
日期
说明
金额

我们的想法是,查询应该在给定时间段内进行调整,并将它们与计划值结合起来。在我开始实施这个调整之前,这一切都很好。它是99.7%OK,除了在一个时期内给定客户有多个“invoice_type”条目的罕见情况。

编辑: - SQL小提琴

这是问题的SQL Fiddle

如果运行该语句,您将看到客户端ID 5被调整了两次,尽管数据库中只有一个客户端调整。主查询显示两行,因为分组是invoice_type。每个结果行都运行子查询并进行调整。

小提琴显示所需的输出,但声明没有任何修正。

1 个答案:

答案 0 :(得分: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;
    }