我有一个基于MySQL表的“定价历史记录表”。
因为我们有很多类似的清单,所以除了ItemID之外,其中许多条目都显示为重复项。

这是我目前清除重复项的方式(不是真正的重复项,而是具有相同SKU,Ymd日期,先前价格,新价格和销售渠道的类似清单。)-并尝试进行计数(请参见下面的$ count逻辑) )找到了多少个相同/“重复”的行)

$inventoryhistoryrows = array();

$skuarray = array();

foreach ($pricehistoryarray as $ph_key => $ph_values) {

// defining variables, etc.
. . . . .

$ph_sku_timestamp = $inventoryskus . ' ' . $ph_timestamp . ' ' . $ph_previousprice . ' ' . $ph_newprice . ' ' . $ph_channel;

if (in_array($ph_sku_timestamp, $skuarray)) { continue; }

$skuarray[] = $ph_sku_timestamp;

if(isset($prev)) {
    $newcount = $count - $prev;
    $prev = $count;
}
else {
    $prev = $count;
    $newcount = $count;
}


$ inventoryhistoryrows [] = array($ newcount,$ ph_itemid,$ inventoryskus,$ ph_previousprice,$ ph_newprice,$ ph_channel,$ ph_timestamp);

这正在工作....但是我的$newcount总是排在前面!

这是表中输出的说明:

php - 获取阵列中实例数的计数(继续后减去;循环中的语句)-LMLPHP

注意最左侧的箭头。 $ newcount变量是正确的,但整个第一列需要向上移动一行。

这意味着,1应该从第一行中删除。 3应该在第一行。 17应该在第二行。

我当然可以看到第一行出现1的原因是此语句

else {
    $newcount = $count;
}


这意味着第一行将始终返回1,因为prev不存在。但是我只是把它放在那儿,因为我不确定如何根据需要获取数据。

有人对我该怎么做有任何想法吗?在$pricehistoryarray的初始foreach循环中(我想这会是更好的解决方案),或者是一种相对简单的方法,一旦构造了$inventoryhistoryrows数组,它仅将第一列向上移动?

最佳答案

显然,这在MySQL查询中可能更好(请参见注释)

这似乎正在工作

SELECT COUNT(*) as count
     , itemid
     , previousprice
     , newprice
     , channel
     , timestamp
  FROM listing_price_history
 WHERE listing_price_history.timestamp > DATE_SUB(now(), INTERVAL 30 DAY)
 GROUP
    BY previousprice
     , newprice
     , channel
     , DATE(timestamp)
 ORDER
    BY listing_price_history.timestamp DESC


非常感谢@Cid的指导

07-28 00:27