【问题标题】:get previous and next id in table of alphanumeric ids like 33, 33A, 44获取字母数字 id 表中的上一个和下一个 id,如 33、33A、44
【发布时间】:2015-02-19 09:54:10
【问题描述】:

我有以下列出电影剧本中场景的 mysql 表:

TABLE "scenes" 

id (AUTOINCR)    sceneId (VARCHAR)   
0                33
1                12
2                33A
3                44

如您所见,场景没有排序。

现在,我想选择一个特定的 sceneId 并找出之后和之前的场景。

我知道如何以“自然”的方式对列表进行排序:

SELECT sceneId FROM scenes ORDER BY sceneId * 1 ASC

这给了我 sceneIds “12”、“33”、“33A”、“44”,这是自然正确的顺序。

现在,假设我有当前的sceneId“33”,并想找出下一个sceneId的id,即“33A”,id为2。

使用 > 搜索列表中的下一行不起作用,因为它在 33 之后给了我 44,而不是 33A:

SELECT id, sceneId FROM scenes WHERE sceneId > 33 (or "33" as it is a varchar?). 

如何选择这些字母数字类型?

谢谢, 马蒂亚斯

【问题讨论】:

  • 运行SELECT id, sceneId FROM scenes WHERE sceneId > '33' order by sceneId * 1 ASC limit 1会得到什么
  • 我在这里建了一个小提琴:sqlfiddle.com/#!2/d8d4a9/2/0
  • @Kinesias 要获取上一个,您必须对 DESC 进行排序,但您必须始终对数值和字符串值进行排序

标签: mysql alphanumeric


【解决方案1】:

获取 33 的所有场景:

SELECT id, sceneId FROM scenes WHERE CAST(sceneId AS UNSIGNED)=33;

您可以通过使用带有 LIKE 命令然后 CAST 的索引来获得性能提升(以便在搜索 33 时排除“331”)

SELECT id, sceneId FROM scenes WHERE
   sceneId LIKE '33%'
   AND CAST(sceneId AS UNSIGNED)=33;

33岁之后下一个场景,你只需在周围加上一些引号

SELECT id, sceneId FROM scenes WHERE sceneID>"33" ORDER BY sceneId LIMIT 1;

【讨论】:

    【解决方案2】:

    如果您只是通过以下方式订购,则您的第一个查询有问题:

    ORDER BY sceneId * 1 ASC
    

    字符串 "33" 和 "33A" 都转换为数字 33,因此如果 "33A" 出现在 "33" 之后,这只是运气问题,在这种特殊情况下,最好按以下顺序排序:

    ORDER BY sceneId * 1 ASC, sceneId ASC
    

    所以要获取列表中的下一行,您可以使用以下查询:

    SELECT * FROM scenes
    WHERE
      sceneId>'33'
    ORDER BY
      sceneId * 1 ASC, sceneId ASC
    LIMIT 1
    

    要获得以前的,你可以使用这个:

    SELECT * FROM scenes
    WHERE
      sceneId<'33A'
    ORDER BY
      sceneId * 1 DESC, sceneId DESC
    LIMIT 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2011-12-07
      • 2021-12-25
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      相关资源
      最近更新 更多