PHP - 如果其他列中的值是重复的,则Mysql在单列中添加值

时间:2014-02-25 23:06:18

标签: php mysql

在编写下面的代码时,我遇到了解决问题的问题。我从2个不同的表中提取数据并使用内部联接将列链接在一​​起,这很正常。从headkey列获取数据时,可能会有多个行具有相同的“键”来标识订单,然后我需要查看Delivery列以查看订单是否包含值1或-1。我需要能够将1和-1加在一起,所以如果订单有1和-1等于0,这意味着交货被取消。但是如果订单有1 +( - 1)+ 1,那么它将等于1.在这种情况下,这是一个交付。如果delivery列中的值匹配,是否可以在headkey列中添加值?我在考虑使用多维数组,但我并不完全理解它们能够实现它们。

<?php

$TransactionSql = "
SELECT apcshead.Key
, apcshead.DateInvoiced
, apcshead.InvNum
, apcsitem.Headkey
, apcsitem.ItemID
, apcsitem.Quantity
, apcshead.CustomerCode
, customers.BillTo1
, customers.BillTo2
, customers.City
, customers.PostCode
FROM customers 
INNER JOIN (apcshead INNER JOIN apcsitem ON apcshead.Key = apcsitem.Headkey)
ON customers.CustomerCode = apcshead.CustomerCode";


$rs=odbc_exec($conn,$TransactionSql);
while($row = odbc_fetch_array($rs)) 
 {
$Key = odbc_result($rs,"Key");  
$DateInvoiced = odbc_result($rs,"DateInvoiced");
$InvNum = odbc_result($rs,"InvNum");
$Headkey = odbc_result($rs,"Headkey");
$ItemID = odbc_result($rs,"ItemID");
$Quantity = odbc_result($rs,"Quantity");
$CustomerCode = odbc_result($rs,"CustomerCode");

$DateInvoiced = new DateTime($DateInvoiced);
$DateInvoiced_date = $DateInvoiced->format('m-d-Y');

$DeliverySql = "SELECT Quantity, HeadKey FROM apcsitem WHERE HeadKey=20008";

if ($DateInvoiced_date == $Today)
{
    if ($ItemID == 'Delivery' xor $ItemID == 'DeliveryCharge')
    {
    echo '
        <td class="td" valign="top">' . $Key . '</td>
        <td class="td" valign="top">' . $DateInvoiced_date . '</td>
        <td class="td" valign="top">' . $InvNum . '</td>
        <td class="td" valign="top">' . $Headkey . '</td>
        <td class="td" valign="top">' . $ItemID . '</td>
        <td class="td" valign="top">' . $Quantity . '</td>
        <td class="td" valign="top">' . $CustomerCode . '</td>
        </tr> ';
    }
}

}

?>

以下是该表的快照。 Table Example

精简版

$TransactionSql = "SELECT * FROM apcsitem";

$rs=odbc_exec($conn,$TransactionSql);
while($row = odbc_fetch_array($rs)) 
{
$Key = odbc_result($rs,"HeadKey");  
$ItemID = odbc_result($rs,"ItemID");
$Quantity = odbc_result($rs,"Quantity");

if ($ItemID == 'Delivery' xor $ItemID == 'DeliveryCharge')
{
 echo '
        <td class="td" valign="top">' . $Key . '</td>
        <td class="td" valign="top">' . $ItemID . '</td>
        <td class="td" valign="top">' . $Quantity . '</td>
        </tr> ';
    }
}

下面是一个由困惑的员工完成的真实交易的例子:)

enter image description here

所以基本上我需要做的是,如果第二列包含delivery或deliveryCharge来过滤掉它们。然后,如果它们中的任何一个具有重复的HeadKey(第一列中的值),则仅为过滤的列添加最后一列的值。 AKA,具有相同HeadKey的那些。在上图中,他们有Delivery和DeliveryCharge。他们添加并取消了它们。如果您根据组(交付)添加最后一列,结果为0,如果您添加最后一列与组(DeliveryCharge),您也将得到0.实际上,这意味着没有交付!< / p>

2 个答案:

答案 0 :(得分:0)

不要试图通过将业务逻辑更改为数学总和进行优化。

类似的东西:

$delivered = $order["ready"] === "yes" && $order["charged"] === "yes";
$cancelled = $order["ready"] === "yes" && $order["cancelled"] === "yes";

更清楚。

我会考虑将ENUM用于true / false或yes / no字段。它很多更容易理解。你可以拥有任意数量的州,这样你就不需要那些不可思议的-1

答案 1 :(得分:0)

我们可以从这开始......

SELECT h.Key
     , h.DateInvoiced
     , h.InvNum
     , i.Headkey
     , i.ItemID
     , i.Quantity
     , h.CustomerCode
     , c.BillTo1
     , c.BillTo2
     , c.City
     , c.PostCode 
  FROM customers c
  JOIN apcshead h
    ON h.CustomerCode = c.CustomerCode 
  JOIN apcsitem i
    ON i.Headkey = h.Key;