【问题标题】:sort data when loop by a calculated column按计算列循环时对数据进行排序
【发布时间】:2015-09-20 11:51:42
【问题描述】:

请有人帮我按计算出的 $changepercentage 对这张表进行排序。 我的表有 1000 多条记录,并按日期顺序上传。我尝试了 arsort() , SORT() 当它是 echo 但 PHP 说它不是一个数组而是一个字符串。 我也试过 mysqli_fetch_array() 但没有运气。 需要你的帮助。

clo_prices(表)

date        |  name   |   cl_price |
2015-09-15  |  AAA    |    10      |
2015-09-15  |  BAA    |    20      |
2015-09-15  |  ABA    |    30      |
2015-09-16  |  AAA    |    86      |
2015-09-16  |  BAA    |    65      |
2015-09-16  |  ABA    |    33      |

price_list(表格)

date       | name     | volume    | last |
2015-09-15 | AAA      | 6655245   | 56   |
2015-09-15 | ABA      | 5666      | 65   |
2015-09-15 | AAB      | 1333      | 33   |
2015-09-16 | AAA      | 112365    | 56   |
2015-09-16 | ABA      | 23131     | 8    |
2015-09-16 | AAB      | 23330     | 12   |
2015-09-16 | ABB      | 2323122   | 60   |  
2015-09-16 | ACB      | 21222     | 99   |

想要的结果

date       | company    | closing  | volume    | Change % |
2015-09-16 | AAA        | 56       | 6655245   | 66       |
2015-09-16 | ABA        | 65       | 5666      | 9.7      |
2015-09-16 | ACB        | 69       | 1333      | 7        |
2015-09-16 | AAB        | 33       | 112365    | 3.2      |

$queryTMG = "SELECT price_list.date, price_list.name, price_list.last, price_list.volume,
                    clo_prices.date, clo_prices.name, clo_prices.cl_price                   
                FROM price_list 
                INNER JOIN clo_prices
                ON price_list.name = clo_prices.name 
                WHERE price_list.date= '$dateT' AND 
                      clo_prices.date = '$dateT' 
                ORDER BY cl_price DESC LIMIT 10 ";

$queryPMG = "SELECT price_list.date, price_list.name, price_list.last, price_list.volume, 
                    clo_prices.date, clo_prices.name, clo_prices.cl_price
                FROM price_list 
                INNER JOIN clo_prices
                ON price_list.name = clo_prices.name 
                WHERE price_list.date= '$dateT' AND 
                      clo_prices.date = '$dateP' 
                ORDER BY cl_price DESC LIMIT 10";


$resultTMG = mysqli_query($dbc, $queryTMG) or die (mysqli_error());
$resultPMG = mysqli_query($dbc, $queryPMG) or die (mysqli_error());

echo '<table  cellpadding = 15 border =1>';
echo '<tr> 
        <th>Company</th> 
        <th>Closing Rs.</th> 
        <th>Volume</th> 
        <th>Change %</th> 
        </tr>';

while($rowTMG = mysqli_fetch_assoc($resultTMG) AND $rowPMG = mysqli_fetch_assoc($resultPMG))
{
        echo '<tr> <td>'. $rowTMG['name']. '</td>';
        echo '<td>'. $rowTMG['last']. '</td>';
        echo '<td align = "right">'. $volumeTMG = number_format($rowTMG['volume']). '</td>';
        echo '<td align = "right">'.$changeprecentage = 
           number_format((( $rowTMG['cl_price'] - $rowPMG['cl_price'] ) /
                          $rowTMG['cl_price']), 2, '.', '' ). '</td> </tr>';

}

echo '</table>';    

【问题讨论】:

  • 首先你不能同时添加 2 个条件,期望 2 个查询返回相同数量的结果。您可以删除 $volumeTMG = 和 $changeprecentage = 之类的分配,因为这些不是必需的
  • 这在一个查询中是可能的。更快,因为查询优化器可以看到如何对表进行排序。

标签: php mysql arrays string


【解决方案1】:

我可能还不太明白你是如何计算百分比的,因为使用给定的数据我会得到不同的结果,请参阅my fiddle here

SELECT p.date, p.name, p.last, p.volume,
       d.cl_price+0 prevprice,
       c.cl_price+0 currprice,                  
       100*(c.cl_price-d.cl_price)/c.cl_price perc_change
FROM price_list p
INNER JOIN clo_prices c ON p.name = c.name   -- current prices
                       AND p.date = c.date
INNER JOIN clo_prices d ON p.name = d.name   -- previous prices
                       AND '2015-09-15' = d.date
WHERE p.date= '2015-09-16'
ORDER BY perc_change desc

到目前为止,该解决方案是一个 MySQL select 语句,因为所有都可以在单个查询中完成。您可能需要整理一些逻辑或输入数据。

出于示例的目的,我假设 $dateT'2015-09-16' 并且 $dateP'2015-09-15'

【讨论】:

  • 非常感谢cars10,请您解释一下“d.cl_price”是什么
  • 老实说,我不认为我完全理解你的意图。因此,我的查询只是试图向您展示如何将单个表中的选定行相互比较。 d.cl_price 是取自 clo_pricesdate='2015-09-15'name 的价格,而 c.cl_price 是取自同一张桌子但日期为 '2015-09-16' 的相同 name 的价格。我的百分比与您的示例中给出的百分比不同。但是从我的代码中应该清楚它们是如何计算的。随意修改它以满足您的需求!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
相关资源
最近更新 更多