我有一个mysql数据库和一些php,允许您在数据库中创建一个条目,更新条目,并将条目视为网页或xml。我想要做的是添加一个函数来将数据库中的条目向上或向下移动一行,或者发送到数据库的顶部或底部。
我已经看到一些关于做这类事情的在线评论建议在显示页面时进行动态排序,但我正在寻找一个持久的度假胜地。我已经看到一种方法建议在数据库中有一个单独的“排序”字段,它与实际的数据库排序键无关,但我不确定为什么这比实际重新排序数据库更好< / p>
这是表结构的转储:
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Database: `hlnManager`
--
-- --------------------------------------------------------
--
-- Table structure for table `hln_stations`
--
CREATE TABLE IF NOT EXISTS `hln_stations` (
`id` int(6) NOT NULL auto_increment,
`station_title` varchar(60) NOT NULL default '',
`station_display_name` varchar(60) NOT NULL default '',
`station_subtitle` varchar(60) NOT NULL default '',
`station_detailed_description` text NOT NULL,
`stream_url_or_playlist_url` text NOT NULL,
`link_type` varchar(25) NOT NULL default '',
`small_thumbnail_graphic_url` text NOT NULL,
`large_thumbnail_graphic_url` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;
答案 0 :(得分:3)
数据库不以任何顺序“存储”。它们以便于存储子系统的任何方式存储。如果删除记录,新记录可能会使用旧记录的空间“插入”自身进入数据库。虽然看起来数据库总是按特定顺序返回记录,但您不能依赖它。
确保排序顺序的唯一方法是使用字段进行排序。
答案 1 :(得分:3)
不确定“重新排序”数据库是什么意思... SQL数据库通常不会保证在没有ORDER BY子句的情况下返回记录的顺序(如果有的话)。
易于编程,易于使用:使用jQuery或任何javascript库为您实现HTML中的简单拖放界面。在on-complete方法中(或响应保存按钮),触发ajax调用,它将以正确的顺序发送id
的数组。在数据库方面,循环并相应地更新SortOrder,从1开始,然后是2,等等......
难以编程,难以使用:实现经典的上移和下移按钮。单击时,将id
和action
(例如,向上,向下)发送到服务器。有几种策略可以处理此更新,但我将概述几个:
假设用户点击了“向上移动”,您可以将ID与之前的记录交换。
找到上一条记录:SELECT id FROM hln_stations WHERE SortOrder < (SELECT SortOrder FROM hln_stations WHERE id = ...) ORDER BY SortOrder DESC LIMIT 1
运行两个更新语句,交换SortOrder。向下移动。添加特殊代码以检测顶部或底部。
<强>等... 强>
还有其他方法,但对于网络界面,我建议你做Drag + Drop,因为用户会喜欢它。
答案 2 :(得分:2)
不知道在哪里可以找到示例找到示例。但你可以看下面的代码它是非常基本的:
让id
是您的主键,并且有一列sort_order
。您希望按以下顺序存储主键:5,4,3,6,8,7,9,10,2,1。
然后将它们存储在一个数组中:
$my_sorted = array(5,4,3,6,8,7,9,10,2,1);
然后你更新你的表:
update `mytable` set `sort_order` = (index of $my_sorted) WHERE `id`=(array value of that index).
您可以在一个查询中执行此操作,而不是执行许多查询,例如:
$query = "UPDATE `mytable` SET sort_order= CASE id ";
foreach($my_sorted as $key=>$val){
$query .= " WHEN '$val' THEN $key ";
}
$query .="END";
然后在mysql中运行$ query。
更新表后,您可以通过sort_order asc或desc从mytable
中选择订单。
希望这会有所帮助。
答案 3 :(得分:1)
“重新排序”数据库需要两个记录交换主键,或者很可能需要交换除主键之外的所有数据。这很可能是不可取的,因为主键应该是您可以始终引用特定记录的一种方式。
单独的订单字段将是最佳选择。只需确保在订单字段中添加索引,以便保持快速。
答案 4 :(得分:1)
无法确定数据库存储数据的顺序。当我们查询数据库时,我们指定要对数据进行排序的字段名称。
在您的情况下,我将添加一个新列:sequence
int(10)。并编写php函数来更改/更新序列号。当我将使用选择查询时,我将按序号进行排序。