[英]What is the best approach to list a user's recent activities in PHP/MySQL?
[英]What is the best approach to sort MySQL table rows by user choice?
假设我们有一个MySQL表(id,name)和一个支持拖放的列表视图。 用户拖动第90行并将其放在第10行。 保持这种新排序的最佳方法是什么?
I do not mean to keep sorting for every use separately
The HTML/JavaScript is not the problem
我见过一些程序员在表中添加一个权重列,在表中设置较低的数字。 在我的示例中,它将是1到100. 问题是在上述示例(90到10)的情况下,需要更新81行。 90改为10,每增加10到89。 它在MySQL中有效吗? 有没有更好的解决方案?
另一种方法可能是将新订单保存为另一个表中的字符串, 但在这种情况下,我们会在检索阶段丢失MySQL排序!
我记得当我们在大学里学习树形结构作为索引工具时,我们说哇! 即使我们利用一个字节的每一位,1.5 GB的纯文本数据存储在不到500KB! 所以现在我仍然寻找更好的答案!
更新在先前占用的索引中添加了对象的数组的索引时,即使编程语言也会为每个索引添加一个。
您将不得不最终更新每一行的索引。
然而,最干净的方法就是这样(当然人们是一个非常简单的表格):
UPDATE people
SET index = index + 1
WHERE index BETWEEN $newIndex AND $oldIndex;
根据您的数据库,可能包括或排除上限和下限数字。 只要确保你知道如何对待他们!
而不是向MYSQL表添加weight
列,而是向表中添加next_object
列。
它的功能类似于链表(如果您熟悉它)。 输入的每个对象都将指向下一个对象。
让我们来看看将位置90对象移动到位置10的场景。
首先,您需要更新第89个对象,使其现在指向第91个对象(新的第90个对象)
然后,您需要更新第9个对象,并指向第90个对象(新的第10个对象)
最后,您需要更新第90个对象(新的第10个对象),并指向第10个对象(新的第11个对象)
当然,我的意思是,将next_object
字段更新为我说我指向的对象。
你究竟能把它作为一个值放在next_object
字段中? 只是对象的ID,或类似的东西。
当我开始写这个答案时,我只是想出了这个系统,所以我不确定这是最有效的方法。 但是,嘿,更新3个对象比潜在的100,000个更好(如果你有100,000个对象)。
最后,我通过这种方法进行了排序:我创建了一个权重列。 插入后的每一行都将其id作为权重值。 它确保新行将结束。 重量栏是FLOAT的类型。 Jquery有助于获取行的新位置,以及prev()和next()表行。 正确的新版本我们有三种情况在下面的代码片段中进行了注释(从行中检索ID并将Ajax发送到PHP之后):
#table of DB
$table = $_POST['table'];
#the id of the row on top
$t = $_POST['t'];
#the id of the row on middle
$m = $_POST['m'];
#the id of the row on bottom
$b = $_POST['b'];
switch ('') {
#top is empty, so the row is droped on top
case $t:
#we set middle weigh 0.5 lower than its bottom
$query = "
UPDATE `$table` m, `$table` b
SET m.`weight` = b.`weight`-0.5
WHERE m.`id` = $m
AND b.`id` = $b
";
break;
#bottom is empty, so the row is droped on the end
case $b:
#we set middle weigh 0.5 upper than its top
$query = "
UPDATE `$table` m, `$table` t
SET m.`weight` = t.`weight`+0.5
WHERE m.`id` = $m
AND t.`id` = $t
";
break;
#values are not empty, so the row is droped in the middle part
default:
#we set middle weigh exactly between top and bottom
$query = "
UPDATE `$table` m, `$table` t, `$table` b
SET m.`weight` = (t.`weight`+b.`weight`)/2
WHERE m.`id` = $m
AND t.`id` = $t
AND b.`id` = $b
";
break;
}
Yii::app()->db->createCommand($query)->query();
即使经过45次除1到2次,浮点值也不会降到零,所以我这个解决方案现在就是一个补救措施!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.