我有以下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
答案 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;