数据显示顺序

时间:2019-03-18 09:45:40

标签: mysql

我有一个MySQL表,当使用PHP在网页上显示时,我希望按照特定的顺序对其进行排序。为此,我有一个带有唯一值的“ displayorder”列。此列中具有较低值的行将首先显示。

问题是手动插入新行很困难,因为我必须调整许多行的“ displayorder”才能使新行适合。有我不知道的更好的方法吗?

所需的顺序可能如下所示:

Action
Adventure
MMO
Roleplaying
Simulation
Strategy
Software
Reference

2 个答案:

答案 0 :(得分:2)

一种相当简单的方法是将排序列创建为decimal而不是integer。这样,您可以使用诸如123等值的表来启动表,并且当您想在1和{{1}之间插入记录时},您只需将其插入为2

对于经常更新的表,您想选择大量的十进制数字(最大值1.5对此可能太大,但这是可能的选择)。

答案 1 :(得分:1)

您可以创建一个过程,该过程将执行插入和顺序转换并使用它,而不是在php中编写INSERT INTO ...

例如:

DROP TABLE IF EXISTS test;
CREATE TABLE test
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  orderPlace INT NOT NULL,
  datas VARCHAR(255) NOT NULL DEFAULT 'foo'
);

INSERT INTO test (orderPlace) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);


DROP PROCEDURE IF EXISTS InsertNewRowAndShiftOrder;

DELIMITER $

CREATE PROCEDURE InsertNewRowAndShiftOrder(IN OrderValue INT,
                                           IN SomeData VARCHAR(255))
BEGIN

    INSERT INTO test VALUES (DEFAULT, OrderValue, SomeData);

    SET @LastId = LAST_INSERT_ID();

    UPDATE test SET orderPlace = orderPlace + 1
    WHERE orderPlace >= OrderValue
    AND id <> @LastId;
END$

DELIMITER ;

CALL InsertNewRowAndShiftOrder(5, 'bar');

SELECT * FROM test ORDER BY orderPlace;

这将输出:

id  orderPlace datas    
1   1          foo  
2   2          foo  
3   3          foo  
4   4          foo  
11  5          bar  
5   6          foo  
6   7          foo  
7   8          foo  
8   9          foo  
9   10         foo  
10  11         foo  

注意:由于该网站上的某些原因,我无法提供DB-fiddle链接,因为该链接不起作用。我在本地MySQL数据库上进行了测试