Php 如何不依赖MySQL中自动递增的ID来选择上一条记录?
比如说,我在MySQL上有一个名为tbl_order的表,其结构如下图所示: --------------------------------------------------------------------------------------------------------- | id | grade | type | order_date | order_confim_time | vol_in | vol_out | vol_dev | status | | AI | VARCH | VARCH | TIMESTAMP | TIMESTAMP | DOUBLE | DOUBLE | DOUBLE | VARCH | --------------------------------------------------------------------------------------------------------- | 81 | AAA | IN | 2014-09-10 09:00:00 | 2014-09-10 13:00:00 | 498000 | 0 | -2000 | CONFIRM | | 83 | AAA | IN | 2014-09-10 10:01:00 | 2014-09-10 14:00:00 | 998000 | 0 | -2000 | CONFIRM | | 85 | AAA | OUT | 2014-09-11 09:02:00 | 2014-09-11 13:00:00 | 0 | 99000 | -1000 | CONFIRM | | 87 | AAA | OUT | 2014-09-11 10:03:00 | 2014-09-11 14:00:00 | 0 | 145000 | -5000 | CONFIRM | | 89 | AAA | OUT | 2014-09-12 09:04:00 | 2014-09-12 13:00:00 | 0 | 120000 | -5000 | CONFIRM | | 91 | AAA | OUT | 2014-09-12 09:06:00 | NULL | 0 | 130000 | -2000 | NOTCONF | | 93 | AAA | OUT | 2014-09-13 10:05:00 | 2014-09-12 14:00:00 | 0 | 115000 | -5000 | CONFIRM | --------------------------------------------------------------------------------------------------------- 结果非常好,只尊重订单确认时间,不允许为空值 我如何获得前一行而不需要依赖于ORDER BY id DESC?目前我依赖于订单确认时间Php 如何不依赖MySQL中自动递增的ID来选择上一条记录?,php,mysql,sql,yii,Php,Mysql,Sql,Yii,比如说,我在MySQL上有一个名为tbl_order的表,其结构如下图所示: --------------------------------------------------------------------------------------------------------- | id | grade | type | order_date | order_confim_time | vol_in | vol_out | vol_dev | status |
我在伪代码中使用YII 1.1.16-branch、php5.4@windows7x64、MariaDB 5.5.38,您可以这样做: 初始化临时变量 初始化我的数组 循环你的记录 在将记录传递到my_数组之前,请在此处执行一些条件 my_数组中存储的记录[temp_var] 增量温度
最后是my_数组,它包含带有临时变量索引的记录。这是直截了当的解决方案,但您可以在SQL查询中执行此操作,并在脚本中添加一些逻辑。我不理解您的问题,如何获得id=93的行,而不需要依赖于按id描述的顺序,“你能把你想得到的结果贴出来吗?”布莱恩·德米利亚,如果我的问题不清楚,很抱歉。目标/预期结果是我可以在不依赖id字段的情况下获得上一行id。目前我使用的是订单确认时间,但仅显示不为空的订单确认时间和数据值。请看这张照片。有两个圆圈,红色和绿色。“我想做这样的事情。”布莱恩·德米利亚,对我的案子有什么想法吗?我已经简化了代码,但仍然只得到前一行。其余的仍然指向前一行。
SELECT * FROM `tbl_order` WHERE `tbl_order`.`grade` = 'AAA' AND `tbl_order`.`order_confim_time` < NOW() ORDER BY `tbl_order`.`status` DESC, `tbl_order`.`order_confim_time` ASC
---------------------------------------------------------------------------------------------------------
| id | grade | type | order_date | order_confim_time | vol_in | vol_out | vol_dev | status |
| AI | VARCH | VARCH | TIMESTAMP | TIMESTAMP | DOUBLE | DOUBLE | DOUBLE | VARCH |
---------------------------------------------------------------------------------------------------------
| 91 | AAA | OUT | 2014-09-12 09:06:00 | NULL | 0 | 130000 | -2000 | NOTCONF |
| 93 | AAA | OUT | 2014-09-13 10:05:00 | 2014-09-12 14:00:00 | 0 | 115000 | -5000 | CONFIRM |
| 89 | AAA | OUT | 2014-09-12 09:04:00 | 2014-09-12 13:00:00 | 0 | 120000 | -5000 | CONFIRM |
| 87 | AAA | OUT | 2014-09-11 10:03:00 | 2014-09-11 14:00:00 | 0 | 145000 | -5000 | CONFIRM |
| 85 | AAA | OUT | 2014-09-11 09:02:00 | 2014-09-11 13:00:00 | 0 | 99000 | -1000 | CONFIRM |
| 83 | AAA | IN | 2014-09-10 10:01:00 | 2014-09-10 14:00:00 | 998000 | 0 | -2000 | CONFIRM |
| 81 | AAA | IN | 2014-09-10 09:00:00 | 2014-09-10 13:00:00 | 498000 | 0 | -2000 | CONFIRM |
---------------------------------------------------------------------------------------------------------
// i made simplify code, but still the code only work on 1st previous row. the rest still not.
public function getPrevRow() {
if (is_null($this->order_confim_time))
{
$data = self::model()->find(array(
'condition' => '`t`.`grade`=:type_order AND (`t`.`order_date` '`t`.`status` DESC, `t`.`order_confim_time` DESC, `t`.`id` DESC',
'limit' => 1,
'params' => array('type_order' => $this->grade, ':current_date_confirm' => $this->order_confim_time),
));
if (is_null($data)) return 0;
else return floatval($data->PrevRow) +
floatval($data->vol_in) +
floatval($data->vol_dev) -
floatval($data->vol_out);
} else {
$data = self::model()->find(array(
'condition' => '`t`.`order_confim_time` '`t`.`status` DESC, `t`.`id` DESC',
'limit' => 1,
'params' => array(':current_date_confirm' => $this->order_confim_time, 'type_order' => $this->grade),
));
if (is_null($data)) return 0;
else return floatval($data->PrevRow) +
floatval($data->vol_in) +
floatval($data->vol_dev) -
floatval($data->vol_out);
}
}