【问题标题】:MYSQL select a piece of a string and order by that pieceMYSQL 选择一段字符串并按该段排序
【发布时间】:2011-09-22 11:41:21
【问题描述】:

我有一个包含此类信息的字段“web-1/1.,web-2/2.,web-3/3.,web-4/4.,web-5/5.”。其他寄存器可能有不同的值,例如“web-1/4.,web-2/5.,web-3/1.,web-4/2.,web-5/3”。

我想通过 web-2/ 来选择和订购?将是 web-2/1、web-2/2、web-2/3 等等所有包含 web-2 并按最后一个数字排序的字段

我想为不同的网站创建一个特色属性脚本并指定功能编号。不同的属性,不同的网站不同的顺序

【问题讨论】:

  • 如果数据被规范化(不存储为逗号/等分隔列表),这会简单得多。

标签: php mysql sql


【解决方案1】:

我建议您查看MySQL String Functions,更具体地说,查看SUBSTRING_INDEX 函数。我之所以建议这个而不是SUBSTRING,是因为斜杠之前或之后的数字可能不止一个数字,这会使第一部分和/或第二部分的长度有所不同。

示例:

SELECT   `info`,
         SUBSTRING_INDEX(`info`, '/', 1) AS `first_part`,
         SUBSTRING_INDEX(`info`, '/', -1) AS `second_part`
FROM     `table`
ORDER BY `first_part` ASC,
         `second_part` ASC;

结果:

其他示例

在此示例中,我使用CAST 将第二部分转换为无符号整数,以防它包含其他字符,例如符号或字母。换句话说,“web-4/15”的第二部分。将是“15”,“web-4/15****”的第二部分也将是“15”。

SELECT   `info`,
          SUBSTRING_INDEX(`info`, '/', 1) AS `first_part`,
          CAST(SUBSTRING_INDEX(`info`, '/', -1) AS UNSIGNED) `second_part`
FROM     `table`
ORDER BY `first_part` ASC,
         `second_part` ASC;

【讨论】:

  • 啊,我明白你的意思了。但是这个解决方案不会将 second_part 视为字符串并且仅适用于值 0-9 吗?
  • @Martin - 不。实际上,我使用该代码来拆分 IP 地址,但我意识到将两个 SUBSTRING_INDEX 一起使用会使它过于复杂。我已经更新了我的答案,但是SUBSTRING_INDEX 中的 -1 表示找到最后一个匹配项(那么在这种情况下,斜线之后是什么)。
  • 示例我在“web-1/2.,web-2/3,web-3/4.,web-4/5.,web-5/1.”字段中有这个。我想排序并选择包含“web-3/”的行,并按斜杠“/4”后的值排序
  • @charlymz - 您是否建议在最后一个数字之后可能有一个句点 (.)?排序时是否要包含斜线? “/4”应该是最后一个数字还是只适用于以“/4”结尾的数字?我有点不清楚你的意思。
  • 我喜欢你的方法,但我做了一些调整 SELECT websites, SUBSTRING_INDEX(SUBSTRING_INDEX(websites, 'web-5/', -1), ',', 1) AS @987654334 @ FROM properties_featured WHERE 网站 LIKE '%web-5/%' ORDER BY length(second_part) ASC, second_part ASC;它给了我:网站 second_part web-1/2.,web-2/3.,web-3/45.,web-4/5.,web-5/1 1 web-1/4.,web-2 /5.,web-3/1.,web-4/2.,web-5/3 3 web-1/5.,web-2/1.,web-3/2.,web-4/3 .,web-5/4 4 web-1/1.,web-2/2.,web-4/4.,web-5/5 5
【解决方案2】:

如果字符串始终与您描述的模式匹配,我们可以假设您要排序的第一个值是字符串中的索引位置 5(从左侧算起 5 个字符)。第二个字符是索引 7。考虑到这一点,您可以执行以下操作,假设字符串 'web-2/1' 位于名为 field 的字段中:

SELECT
  `field`
FROM
  `table`
ORDER BY
  substr(`field`, 5, 1) ASC,
  substr(`field`, 7, 1) ASC;

substr() 函数将字段作为第一个选项,我们上面提到的索引,以及一个选项第三个参数,它是从第二个选项开始包含多少字符的计数。

如果字符串稍微偏离,您可以根据需要进行调整,主要是 subtr() 函数中的第二个选项。

【讨论】:

  • 正如我在回答中解释的那样,在这种情况下,使用SUBSTR(与SUBSTRING 一样理智)不一定是最佳选择。在问题中,第一部分和第二部分的长度相同,但可能并非总是如此。 SUBSTRING_INDEX 可能是更好的选择。
【解决方案3】:

只需添加:...ORDER BY SUBSTRING(username, 2) ASC

【讨论】:

    【解决方案4】:

    我会这样做

    SELECT info
    FROM table
    WHERE info LIKE 'web-2%'
    ORDER BY info ASC
    

    【讨论】:

    • 如果条目很多,我不建议进行类似比较。它对较小的数据集似乎很有效,但当您有很多条目时会窒息。不能很好地扩展。
    • 除了@Scott 的评论,问题是关于订购,而不是搜索。 LIKE 不能用于对结果进行排序。
    • 是的,字符串可以是 web-2/5.,web-6/4., web-5/1,我想通过 web-6/ 订购?示例
    • 什么?那么单个字段具有逗号分隔值的集合吗?您的问题不是查询,而是结构。你有创建权限吗?打破这些价值观
    猜你喜欢
    • 2017-06-17
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多