我有一个MySQL表,当使用PHP在网页上显示时,我希望按照特定的顺序对其进行排序。为此,我有一个带有唯一值的“ displayorder”列。此列中具有较低值的行将首先显示。
问题是手动插入新行很困难,因为我必须调整许多行的“ displayorder”才能使新行适合。有我不知道的更好的方法吗?
所需的顺序可能如下所示:
Action
Adventure
MMO
Roleplaying
Simulation
Strategy
Software
Reference
答案 0 :(得分:2)
一种相当简单的方法是将排序列创建为decimal
而不是integer。这样,您可以使用诸如1
,2
,3
等值的表来启动表,并且当您想在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数据库上进行了测试