在编写下面的代码时,我遇到了解决问题的问题。我从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> ';
}
}
}
?>
以下是该表的快照。
精简版
$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> ';
}
}
下面是一个由困惑的员工完成的真实交易的例子:)
所以基本上我需要做的是,如果第二列包含delivery或deliveryCharge来过滤掉它们。然后,如果它们中的任何一个具有重复的HeadKey(第一列中的值),则仅为过滤的列添加最后一列的值。 AKA,具有相同HeadKey的那些。在上图中,他们有Delivery和DeliveryCharge。他们添加并取消了它们。如果您根据组(交付)添加最后一列,结果为0,如果您添加最后一列与组(DeliveryCharge),您也将得到0.实际上,这意味着没有交付!< / p>
答案 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;