【问题标题】:Ordering By a Varchar column is that even possible?按 Varchar 列排序甚至可能吗?
【发布时间】:2021-11-20 09:52:23
【问题描述】:

我正在将 Laravel 用于一些 sass 项目,如果我们的房间在实际数字旁边接受(按字母顺序排列),则某些交易比完成晚一步 101 - A101 等。

所以 room_number 列的数据类型是 int,所以我将它转换为 varchar 到现在为止没有问题,一切正常。

收到一个新请求,我们希望以特定方式对这些房间进行排序,例如,如果我有 101、102、A101、103、B102 房间,它们必须按 101、A101、102、B102、103 排序

屏幕下方可能会给您一些想要实现的目标

根据屏幕,房间 A101 必须在房间 101 之后,房间 B102 必须在房间 102 之后等等。

我尝试了以下

Room::where(.....)
->orderByRaw("CAST(room_number as UNSIGNED) ASC")
->get(); 

我也尝试在拿到收藏后对其进行排序

Room::where(.....)
    ->orderByRaw("CAST(room_number as UNSIGNED) ASC")
    ->get()
    ->sortBy('order', SORT_REGULAR, true); 

但是我所有的尝试都走上了一条死路! 我想对这些房间执行二进制搜索并应用自定义解决方案,但我想我可以先问一下,也许有人有同样的问题!

【问题讨论】:

  • 这个问题有一些答案可能会有所启发:stackoverflow.com/questions/47903727/… 也许您可以让sortBy 闭包将字符移到字符串的末尾,以便在没有任何字符的数字。
  • 您可以在表格中添加列吗?一个用于前缀(在这种情况下为“A”或“B”......),一个用于数字(101、102、103......)当然是整数。所以你可以先按数字排序,再按前缀排序。
  • @mulquin 嗯,这似乎是一个合理的建议,谢谢
  • @UğurArıcı 不幸的是,它是一列 room_number 但等等,你的意思是不是将 room_number 列从 int 转换为 varchar 我将其保留为 int 然后我添加一个新列可能是 room_number_alpha 并且当用户将房间号发送为 E105 我拆分传入的字符串并存储它?!!!请注意 room_number 必须是唯一的
  • @EmadRashadMuhammed 是的,对于这个特定的需求,您可以添加 2 个额外的列并根据基本和唯一的 room_number 字段自动设置和更新它们。当您将任何内容设置为room_number 时,您可以将room_number_prefix 设置为null 或给定字符串并将room_number_integer 设置为给定数字。您可以在 DB 上设置这两个索引。这不是最好的,但可能是一个解决方案。

标签: php laravel sorting alphanumeric


【解决方案1】:

您可以使用 REGEXP_REPLACE() 或 REGEXP_SUBSTR() 来提取数值进行排序,这里是一个示例

Room::where(.....)
    ->orderByRaw("REGEXP_REPLACE(room_number, '[^0-9]+', '') ASC")
    ->get();

Room::where(.....)
    ->orderByRaw("REGEXP_SUBSTR(room_number,'[0-9]+') ASC")
    ->get();

注意:如果您需要更多自定义,请考虑使用“ORDER BY 案例"

【讨论】:

  • 第一个解决了我的问题,实际上,如果您看到以前的 cmets,我在获取集合后设法使其在 sort() 中工作,但我认为您的解决方案更快,所以我会接受它,谢谢很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多