【问题标题】:Sort value by date value in same row按同一行中的日期值对值进行排序
【发布时间】:2017-05-08 22:09:37
【问题描述】:

我有一张如下表 -

Columns are like,
Id,
job_1
comp_1
date_1
job_2
comp_2
date_2
job_3
comp_3
date_3

日期存储在 varchar 中,例如 '4/1990'

所以我希望该值按日期排序。

我使用了如下代码 -

$sql=mysql_fecth_array(mysql_query("SELECT * FROM table"));
for($i=1;$i<=3;$i++){
   $arr['job_'.$i]=$sql['job_'.$i];
   $arr['comp_'.$i]=$sql['comp_'.$i];
   $arr['date_'.$i]=$sql['date_'.$i];
}

现在,我该如何进一步按日期排序?

【问题讨论】:

  • mysql_query(以及其他前缀为mysql_)已被弃用。改变你的初始逻辑
  • 见规范化。枚举列名通常是设计不佳的症状。
  • 一言不发

标签: mysql arrays sorting


【解决方案1】:

为什么不将年之后的月份作为整数放在单独的数组列中? (或者这可以在数据库中完成)。这样,由于年份和日期是连续的,您可以对整数值进行排序。

在 SQL 中是这样的:

CREATE TABLE dateTable (`date` CHAR(6));

INSERT INTO dateTable VALUES ('4/1990'), ('3/1989'), ('5/1991');

SELECT `date` FROM dateTable; # Not sorted

SELECT `date`, CONCAT(MID(`date`, INSTR(`date`, '/') + 1, 4), LEFT(`date`, INSTR(`date`, '/') - 1)) sortDate FROM dateTable ORDER BY CONCAT(MID(`date`, INSTR(`date`, '/') + 1, 4), LEFT(`date`, INSTR(`date`, '/') - 1)); # Sorted

在 PHP 中也是这样:

/* got this function from the following SO post: http://stackoverflow.com/questions/2699086/sort-multi-dimensional-array-by-value */
/* full credit to o0'. */
/* thanks! */

function aasort (&$array, $key) {
    $sorter=array();
    $ret=array();
    reset($array);
    foreach ($array as $ii => $va) {
        $sorter[$ii]=$va[$key];
    }
    asort($sorter);
    foreach ($sorter as $ii => $va) {
        $ret[$ii]=$array[$ii];
    }
    $array=$ret;
}

$sql=mysql_fecth_array(mysql_query("SELECT * FROM table"));
for($i=1;$i<=3;$i++){
   $arr['job_'.$i]=$sql['job_'.$i];
   $arr['comp_'.$i]=$sql['comp_'.$i];
   $arr['date_'.$i]=$sql['date_'.$i];

   $slashPos = strpos($sql['date_'.$i], "/");

   $arr['sortdate_'.$i]= (int)(substr($sql['date_'.$i], $slashPos + 1, 4) . substr($sql['date_'.$i], 1, $slashPos - 1));
}

aasort($arr, "sortdate")

请注意,我没有尝试过 PHP 代码,我不确定您为什么要将行号写入数组键,但这应该为您指明可行解决方案的方向。

如果您需要任何进一步的信息,请告诉我。

詹姆斯

【讨论】:

    猜你喜欢
    • 2014-05-12
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多