嵌套 MySQL 查询和字母数字排序

Nested MySQL Queries and Alphanumeric Ordering

所以,一段时间以来,我一直在尝试在我的代码中使用嵌套 MySQL 查询和 table 的字母数字排序。

以下面的例子为例 table:

Subprocess_has_Characteristic{
  ID (PK)
  SubProcessID (FK)
  CharacteristicID (FK)
}

以下是 table 的示例值:

ID 子进程 ID 特征 ID


ID1 子进程 ID1 特征 ID1

ID2 子进程 ID1 特征 ID2

ID3 子进程 ID2 特征 ID1

ID4 子进程 ID2 特征 ID2

... ... ...

ID11 子进程 ID1 特征 ID5


这意味着我们需要以下 MySQL 查询来按字母数字顺序对 table 进行排序并避免以下情况:{ ID1, ID10, ID11, ID2, ID3, ..., ID9} 和得到以下内容:{ ID1, ID2, ..., ID9; ID10, ID11}

SELECT *,substring(ID, 1, 2) as bcd, 
CONVERT(SUBSTRING(ID, 2, 5),UNSIGNED INTEGER) 
AS num from `Subprocess_has_Characteristic` order by bcd,num;

大功告成,我目前在尝试将此查询嵌套在另一个查询中以仅根据特定的 SubProcessID 过滤查询时遇到问题,如下所示:

SELECT * FROM `Subprocess_has_Characteristic` WHERE `SubProcessID` = 'SubProcessID1'

如果我单独使用这个查询,结果显示如下:

ID 子进程 ID 特征 ID


ID1 子进程 ID1 特征 ID1

ID11 子进程 ID1 特征 ID5

ID2 子进程 ID1 特征 ID2


而我需要它像这样显示:

ID 子进程 ID 特征 ID


ID1 子进程 ID1 特征 ID1

ID2 子进程 ID1 特征 ID2

ID11 子进程 ID1 特征 ID5


这就是我试图嵌套前面提到的两个 MySQL 查询的目的。不幸的是,我的代码无法正常工作。

我一直在尝试使用的查询如下:

SELECT * FROM `Subprocess_has_Characteristic` WHERE `SubProcessID` = 'SubProcessID1' IN (
SELECT *,substring(ID, 1, 13) as bcd, 
CONVERT(SUBSTRING(ID, 14, 20),UNSIGNED INTEGER) 
AS num from `Subprocess_has_Characteristic` order by bcd,num);

不幸的是,这会产生以下错误:

#1241 - Operand should contain 1 column(s)

我的 MySQL 语法有错误吗?

编辑

我将示例更改为更精确的案例场景;希望这有助于理解我想要实现的目标。

是的,您的 SQL 语法确实有错误(实际上是多个错误)。

以下是要点

  • 您的 where 子句包含 2 个运算符(=IN),您实际要使用哪一个?
  • 子查询是 returning 多列,但对于 IN 运算符
  • 应该只有 return 一个
  • semi-colon (;) 放错地方了

恐怕我不理解你想要达到的目标,所以我无法帮助你进行适当的更正。

Length()函数returns计算ID中的字符个数。所以ID只有个位数的会排在第一位,以此类推...

SELECT * FROM `Subprocess_has_Characteristic`
 WHERE `SubProcessID` = 'SubProcessID1'     
 ORDER BY LENGTH(ID), ID;