【问题标题】:Sort html table by id that is stored as varchar in db按在 db 中存储为 varchar 的 id 对 html 表进行排序
【发布时间】:2018-06-05 21:07:16
【问题描述】:

我在数据库中有一个表,其中一列将 ID 存储为 varchar。当我使用 PHP 从 db 获取数据并将其显示在 HTML 表中时,我希望它按 ID 排序。最后记录被排序,但是以一种奇怪的方式..:

  ID      name
------------------
|AA120  |        |
|AA121  |        |
|AA122  |        |
|AA1199 |        |
|AA119  |        |
|AA1200 |        |
|AA1201 |        |
|AA1202 |        |
etc.

我在查询中使用这个字符串:

ORDER BY CONVERT('$ID',UNSIGNED INTEGER)

是否有解决此类问题的方法..?

【问题讨论】:

  • varchar 的 id 排序正确。您是否考虑过使用int ids?
  • 最好将 PK 分成数字和非数字组件 - $id 是什么!?!?!?
  • 是的,但是某些 id 可以在它们的末尾添加索引,例如 A 或 B...
  • 那么,更复杂的是,您的数据集没有代表性?
  • Id 由产品类型和编号组成,它们是 db 中的两个独立列,并存储为 int 和 varchar...

标签: php mysql html-table


【解决方案1】:

为什么不获取所有记录,并使用natsort 对其进行排序,然后显示它们?

【讨论】:

  • 谢谢哈利。数组有时可以达到 50000 条记录。这会减慢整个过程吗?
  • 我没有对这个功能进行过如此广泛的测试。但是,我不会一次加载 50,000 条记录以显示在页面上。获取x数量的记录,然后使用ajax获取更多,并使用相同的过程对其进行排序。
  • 效果很好!!非常感谢哈利!!
【解决方案2】:

试试这个查询,它既适用于整数,也适用于字符串和整数的组合

select column 
    from table
    order by 
      regexp_substr(column, '^\D*') nulls first,
      to_number(regexp_substr(column, '\d+'))

【讨论】:

  • 感谢yanivx,但查询失败
  • 是的,对不起哥们,oracle 支持函数 regexp_substr to_number 你可以找到我教过的类似的替代方法删除它但不能:(对不起
【解决方案3】:

您会得到字母数字(“字母”)排序 - 这就是 AA119 排在 AA1199 之后的原因。 PHP 的 natsort 将是一个解决方案,但我宁愿建议切换到填充编号,例如 AA0119 而不是 AA119,以防止在混合字母和数字逻辑时出现进一步的问题

【讨论】:

  • 感谢 proligde,但这些项目已经在那里,并且每个项目都有一个我无法以任何方式更改的 id..
【解决方案4】:

你能试试这个命令吗@Dims

  select col_name from table_name order by len(col_name), col_name

【讨论】:

  • 它失败并显示此错误消息.. FUNCTION table_name.len 不存在.. 我是 mysqli 新手,所以我不太了解它..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2023-01-10
相关资源
最近更新 更多