新插入的数据必须先显示

时间:2016-10-20 14:36:41

标签: php mysql sum

我在这个表格中有一些产品:

Id | Name | Order
------------------
3 | Prod3 | 1
2 | Prod2 | 2
1 | Prod1 | 3

我需要的是:当添加一些新产品时,新产品应该是第一个按'order'(INT)排序的产品,如下所示:

Id | Name | Order
------------------
4 | NewPr | 1    
3 | Prod3 | 2
2 | Prod2 | 3
1 | Prod1 | 4

这意味着其他人应该是:以前的订单 + 1

如何用SQL实现呢?

目前我正在这样做(与我现在需要的相反):

在插入之前,获取最后一个订单号

$query = mysqli_query($link, "SELECT `order` FROM `products` ORDER BY `order` DESC LIMIT 1");
while($orderData = mysqli_fetch_array($query)) {
    $lastOrder = $orderData['order'];
};
$newOrder = $lastOrder + 1;

添加新产品

INSERT INTO `products` (`name`, `order`)
VALUES ('MyLastestProd', $newOrder)

感谢。

编辑:我使用这些数字是因为在其他页面中我有一个可拖动的选项来重新订购这些产品。

编辑2:解决了按'订单'DESC显示订购的产品的问题。所以使用以前的订单 + 1它对我有用。也适用于UI可拖动功能的更改。

2 个答案:

答案 0 :(得分:3)

更简单的方法是将Order表列更改为名为'DateAdded'的时间戳字段,默认值为'CURRENT_TIMESTAMP'

然后在您的表中插入新行时,您只需从表中选择行即可完全订购:

SELECT * FROM MyTable ORDER BY DateAdded DESC

这种方法在执行时更容易,而不必更新表中的每一行。

出于兴趣,为什么你必须在最顶部插入一个新的行? 如果您只是选择最新的行,那么您已经拥有了一个ID列,我假设它是一个设置了auto_increment属性的主键?

那么,为什么不在选择查询中使用ID列作为排序列?

修改

刚看到你的编辑,我现在看到了。

您可以同时使用日期字段和订单字段在查询中进行双重排序。

例如: 如果您添加的每个新产品的订单值都为零,并且旁边记录了时间戳,您仍然可以正确订购这些产品,并且仍允许用户重新订购它们。

答案 1 :(得分:1)

.iphone6 {
    -webkit-transform: rotate(90deg);-moz-transform: rotate(90deg);-o-transform: rotate(90deg);-ms-transform: rotate(90deg);transform: rotate(90deg);
    width: 375px;
    height: 667px;
    padding: 105px;
    background: #d9dbdc;
    -webkit-border-radius: 56px;
    border-radius: 56px;
    -webkit-box-shadow: inset 0 0 3px 0 rgba(0,0,0,0.2);
    box-shadow: inset 0 0 3px 0 rgba(0,0,0,0.2);
}

.iphone6 h1 {
    color: black;
    -webkit-transform: rotate(-90deg);
    -moz-transform: rotate(-90deg);
    -o-transform: rotate(-90deg);
    -ms-transform: rotate(-90deg);
    transform: rotate(-90deg);    
    position: absolute;    
    left: 20%;    
    top: 48%;
    width: 100%;
}

因此,当您选择产品时,您可以使用

INSERT INTO products (name, order) VALUES 
('MyLastestProd', (select count(a.order)+1 as new_order from products a order by a.order desc limit 1));