【问题标题】:Sort table, using loop in MySQL with SELECT and UPDATE with NATURAL ORDER排序表,在 MySQL 中使用循环,SELECT 和 UPDATE 和 NATURAL ORDER
【发布时间】:2014-05-26 17:35:36
【问题描述】:

很久以前我请HERE帮忙整理表格。并且用户“piotrm”给出了一个很好的解决方案,感谢他!效果很好!

SELECT @p:=0, @parent:=0;
UPDATE page p1
JOIN
( SELECT title, 
  CASE WHEN @parent<>parent_id THEN @p:=0 ELSE @p:=@p+1 END as position,
  @parent:=parent_id as parent_id
  FROM page
  ORDER BY parent_id, title DESC ) p2
ON p1.title = p2.title AND p1.parent_id = p2.parent_id
SET p1.position = p2.position

现在我需要使用自然排序升级此代码。我的意思是它仍然需要以相同的方式排序,但是当它满足以 '2'、'13'、'1'、'26' 开头的 TITLE 时,它必须被排序为 NOT '1'、'13'、' 2', '26';但是'1'、'2'、'13'、'26'。

对于缺乏 SQL 知识,我深表歉意,但我真的需要你的帮助!非常感谢!

【问题讨论】:

  • piotrm,你能帮忙吗?我真的被这个=(

标签: mysql sorting loops select natural-sort


【解决方案1】:
SELECT @p:=0, @parent:=0;
UPDATE page p1
JOIN
( SELECT title, 
  CASE WHEN @parent<>parent_id THEN @p:=0 ELSE @p:=@p+1 END as position,
  @parent:=parent_id as parent_id
  FROM page
  ORDER BY LENGTH(title), title, parent_id ASC ) p2
ON p1.title = p2.title AND p1.parent_id = p2.parent_id
SET p1.position = p2.position

【讨论】:

  • 不,当标题只有数字时有效,但它们只是以数字开头。而且,顺便说一句,它不适用于那些仅由字母组成的标题。但我需要代码来处理这两种情况。无论如何,谢谢)
  • 好的。试试这个ORDER BY CAST(title AS UNSIGNED) 而不是 LENGTH
  • 仍然没有 =( 1. 字母标题随机混乱 2. 开头的数字几乎正常,但是 '16...' - '19...' 不知何故不在这个地方他们假设是 3。它只适用于 ASC
  • 您需要使用与 id 相关的排序修饰符创建新表/列,然后在选择中加入此表并按其排序
  • 我确信一定有一种更简单的方法。如果没有人建议,我会尝试这个。 =)
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多