【问题标题】:MySQL problem in the sorting of column set as varchar(255)MySQL 列设置为 varchar(255) 排序中的问题
【发布时间】:2021-07-11 16:07:51
【问题描述】:

我无法将字段sID_contents_p 设置为VARCHAR (255) 从表ttt 中存储一个数据库MySql version 8.0.17

这是 db-fiddle.com 上的结果,它提供 MySQL 8

我需要这个返回,例如当sID_contents_p 包含 1 时

+----------------+-----+
| sID_contents_p | sID |
+----------------+-----+
| 1.1            |   1 |
| 1.2            |   2 |
| 1.3            |   3 |
| 1.4            |   4 |
| 1.5            |   5 |
| 1.6            |   6 |
| 1.7            |   7 |
| 1.8            |   8 |
| 1.9            |   9 |
| 1.10           |  10 |
| 1.11           |  11 |
| 1.12           |  12 |
| 1.13           |  13 |
| 1.14           |  14 |
| 1.15           |  15 |
| 1.16           |  16 |
| 1.17           |  17 |
| 1.18           |  18 |
| 1.19           |  19 |
| 1.20           |  89 |
+----------------+-----+

我已经尝试过这个查询,但返回的不是你想要的(见上文)......

mysql> SELECT
    sID_contents_p,
    sID
FROM
    `ttt` WHERE SUBSTRING_INDEX(sID_contents_p,".",1) = 1
ORDER BY
    sID_contents_p ASC;
+----------------+-----+
| sID_contents_p | sID |
+----------------+-----+
| 1.1            |   1 |
| 1.10           |  10 |
| 1.11           |  11 |
| 1.12           |  12 |
| 1.13           |  13 |
| 1.14           |  14 |
| 1.15           |  15 |
| 1.16           |  16 |
| 1.17           |  17 |
| 1.18           |  18 |
| 1.19           |  19 |
| 1.2            |   2 |
| 1.20           |  89 |
| 1.3            |   3 |
| 1.4            |   4 |
| 1.5            |   5 |
| 1.6            |   6 |
| 1.7            |   7 |
| 1.8            |   8 |
| 1.9            |   9 |
+----------------+-----+
20 rows in set (0.03 sec)

【问题讨论】:

  • 该列的排序完全符合其应有的要求,因为您不恰当地使用字符串来保存数值。

标签: mysql sql sql-order-by varchar


【解决方案1】:

问题在于排序。你有一个字符串。一种方法是先按长度排序:

ORDER BY LENGTH(sID_contents_p), sID_contents_p

编辑:

如果第一个组件的长度也可以变化,则拆分值并转换为整数:

ORDER BY SUBSTRING_INDEX(sID_contents_p, '.', 1) + 0,
         SUBSTRING_INDEX(sID_contents_p, '.', -1) + 0
         

【讨论】:

  • 请注意,如果目标是按第一个数字然后第二个数字排序,那么这种方法可能不起作用,see here
  • @TimBiegeleisen 。 . .这是一个好点。我添加了一个替代方案。
  • LOL so did I ... 看来 OP 今天又问了哈哈。
猜你喜欢
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多