![](/img/trans.png)
[英]PHP/MySQL Concat to a single column and Update other columns in table
[英]PHP - Mysql adding values in single column if value in other columns are duplicates
我在编写下面的代码时发现零件有问题。 我正在从2个不同的表中提取数据,并使用内部联接将列链接在一起,效果很好。 从headkey
列获取数据时,可以有多个具有相同“键”的行来标识订单,然后我需要查看Delivery
列以查看订单的值是1还是-1。 我需要能够将1和-1相加,因此,如果订单的1和-1等于0,则意味着取消了交货。 但是,如果订单具有1 +(-1)+ 1,则等于1。在这种情况下,这就是交货。 如果headkey
列中的值匹配,是否可以在delivery
列中添加值? 我当时在考虑使用多维数组,但我不完全了解它们是否能够实现它们。
<?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(第一列中的值),则仅为过滤后的列添加最后一列的值。 又名,那些具有相同的HeadKey。 在上图中,他们具有Delivery and DeliveryCharge。 他们添加并取消了它们。 如果您基于组(交付)添加最后一列,则结果为0,如果您将最后一组与组(交付Charge)添加在一起,您也将得到0。实际上,这意味着没有交付!
不要试图通过将业务逻辑更改为数学和来进行优化。
就像是:
$delivered = $order["ready"] === "yes" && $order["charged"] === "yes";
$cancelled = $order["ready"] === "yes" && $order["cancelled"] === "yes";
更清楚。
我会考虑将ENUM
用于true / false或yes / no字段。 这更容易理解。 您可以根据需要拥有任意多个状态,因此不需要笨拙的-1
。
我们可以从这里开始...
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.