楔子:乙亥年末,庚子年初,荆楚大疫,数万人染疾,众人皆恐,足不出户,时天下震动,南山抵守江南郡,率白衣军众数万,九州一心,举国防疫,能者皆竭力。数月,疫尽去。华灯初上,万国称赞,人声鼎沸,国泰民安。
1.今日书签
一个需求一不留神一堆代码,为道极简。该篇 “零” 代码来示例实现项目中经常要用到的诸如商品、类目等适用的拖拽、手填排序。也许有所用有所启发。
2.化繁为简
像下面这样利用 Mysql 的 Rownum 可以得到表数据的行号:
SELECT
@rownum := @rownum + 1 AS rownum,
t.*
FROM
(SELECT @rownum := 0) r,
t_product t
那么,我们就可以发挥一下,利用 Mysql 的 Rownum 实现商品、类目的快速排序:
<update id="updateItemSortIndex" parameterType="java.util.Map">
UPDATE t_product t
INNER JOIN ( SELECT * FROM (
SELECT
@rownum := @rownum + 1 AS rowno, t2.id, t2.sort_index
FROM
(
SELECT
t1.*
FROM
t_product t1
WHERE
t1.store_id = #{storeId}
AND t1.id != #{itemId}
AND t1.is_delete = 0
AND t1.sort_index >= #{targetIndex}
) t2,
(SELECT @rownum := #{targetIndex}) r
ORDER BY
t2.sort_index ASC, id ASC ) TEMP
) t3 ON t3.id = t.id
AND t.store_id = #{storeId}
SET t.sort_index = t3.rowno
</update>
这里,通过定义变量 @rownum 来获取表中的数据行号,通过赋值语句 @rownum := @rownum + 1 来累加达到递增行号。例如:
@rownum := @rownum + 1 AS rowno, t2.sort_index from t2, (SELECT @rownum := #{targetIndex}) r
后半部分语句的 (SELECT @rownum := #{targetIndex}) r 相当于创建了 r 的新表,其表的列为 rownum,数值为行号。然后,通过利用变量将 @rownum 的行进行重新赋值,并更新到业务表排序字段上。这样就可以应用于获取行号或商品、类目等业务排序。