获取字母数字id表中的上一个和下一个id,如33,33A,44

时间:2015-02-19 09:54:11

标签: mysql alphanumeric

我有以下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,即id为2的“33A”。

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

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

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

THX, 的Matthias

2 个答案:

答案 0 :(得分:0)

如果您只是通过以下方式订购,那么您的第一个查询就会出现问题:

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

答案 1 :(得分:0)

获取33的所有场景:

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

您可以通过使用带有LIKE命令的索引然后使用CAST来获得性能提升(为了排除&#34; 331&#34;当您搜索33时)

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;