Pet*_*aig 16 php mysql sorting
我有一张表,每行20行,每个表都有一个显示顺序的数字(1-20).
SELECT * FROM `mytable` ORDER BY `display_order` DESC;
Run Code Online (Sandbox Code Playgroud)
在管理区域中,您可以拖动行或手动为每行键入新编号.
当然,为每一行循环UPDATE查询并不好,在一个或几个适合更新20行甚至更多,50-200 +的单元格的查询中有什么选择?
编辑:很多好的回应和想法.我可能会扩展到目前为止我考虑过的想法:
一个数组字符串:我可以在字符串中输入顺序,按照我想要的顺序列出唯一的行ID - 例如行1,9,2,6,23.更新订单后,隐藏字段将使用JavaScript更新,并在完成时将其添加到数据库或文本文件中:
UPDATE `my_dispaly_order_table` SET `display_order`='1,9,2,6,23';
Run Code Online (Sandbox Code Playgroud)
单独更新每一行:这是我试图避免的,但它只会很少更改,因此每周或每月一次点击20-30次调用可能不是问题,因此只需在每行调用UPDATE就是我通常的情况做:
UPDATE `mytable` SET `display_order`='1' WHERE `rowId` = 1;
UPDATE `mytable` SET `display_order`='2' WHERE `rowId` = 9;
UPDATE `mytable` SET `display_order`='3' WHERE `rowId` = 2;
UPDATE `mytable` SET `display_order`='4' WHERE `rowId` = 6;
UPDATE `mytable` SET `display_order`='5' WHERE `rowId` = 23;
Run Code Online (Sandbox Code Playgroud)
Jam*_*ren 13
soulmerge的回答让我思考,我认为这是一个更好的解决方案.您需要做的是使用IN()选择具有id的行,然后使用CASE设置值.
UPDATE mytable SET display_order =
CASE id
WHEN 10 THEN 1
WHEN 23 THEN 2
WHEN 4 THEN 3
END CASE
WHERE id IN (10, 23, 4)
Run Code Online (Sandbox Code Playgroud)
我目前的应用程序中需要这个.在PHP中,我从jQuery UI的内置Sortable功能中获取了一组序列化(和有序)的id.所以数组看起来像这样:
$new_order = array(4, 2, 99, 15, 32); // etc
Run Code Online (Sandbox Code Playgroud)
要生成单个MySQL更新查询,我这样做:
$query = "UPDATE mytable SET display_order = (CASE id ";
foreach($new_order as $sort => $id) {
$query .= " WHEN {$id} THEN {$sort}";
}
$query .= " END CASE) WHERE id IN (" . implode(",", $new_order) . ")";
Run Code Online (Sandbox Code Playgroud)
最后的"内爆"只是给了我IN()的ID列表.这对我很有效.
sou*_*rge 10
您应该首先确保该列没有UNIQUE索引,否则mysql会告诉您在查询期间约束被破坏.之后你可以做以下事情:
-- Move #10 down (i.e. swap #10 and #11)
UPDATE mytable SET display_order =
CASE display_order
WHEN 10 THEN 11
WHEN 11 THEN 10
END CASE
WHERE display_order BETWEEN 10 AND 11;
-- Move #4 to #10
UPDATE mytable SET display_order
CASE display_order
WHEN 4 THEN 10
ELSE display_order - 1
END CASE
WHERE display_order BETWEEN 4 AND 10;
Run Code Online (Sandbox Code Playgroud)
但实际上你应该确保你只需要一步到位.如果不使用ID,则分两步进行交换将导致编号损坏.即:
-- Swap in two steps will not work as demostrated here:
UPDATE mytable SET display_order = 10 WHERE display_order = 11;
-- Now you have two entries with display_order = 10
UPDATE mytable SET display_order = 11 WHERE display_order = 10;
-- Now you have two entries with display_order = 11 (both have been changed)
Run Code Online (Sandbox Code Playgroud)
有点晚了,但它可能对其他人有用:
UPDATE mytable SET display_order = FIND_IN_SET(rowId, '1,9,2,6,23') WHERE rowId in (1,9,2,6,23)
Run Code Online (Sandbox Code Playgroud)
您可以创建一个临时表并填充要更改的行的主键以及这些行的 display_order 的新值,然后使用 UPDATE 的多表版本一次性更新该表。然而,如果没有测试这两种方法,我不会认为这会更快。