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

时间:2017-02-10 20:26:19

标签: mysql alphanumeric nested-query

所以,我一直试图在我的代码中使用嵌套的MySQL查询和表的字母数字排序。

以下表为例:

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

以下是该表的示例值:

ID SubprocessID CharacteristicID

ID1 SubprocessID1 CharacteristicID1

ID2 SubprocessID1 CharacteristicID2

ID3 SubprocessID2 CharacteristicID1

ID4 SubprocessID2 CharacteristicID2

... ... ...

ID11 SubprocessID1 CharacteristicID5

这意味着我们需要以下MySQL查询来按字母数字顺序排序表并避免以下内容:{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 SubprocessID CharacteristicID

ID1 SubprocessID1 CharacteristicID1

ID11 SubprocessID1 CharacteristicID5

ID2 SubprocessID1 CharacteristicID2

我需要它像这样显示:

ID SubprocessID CharacteristicID

ID1 SubprocessID1 CharacteristicID1

ID2 SubprocessID1 CharacteristicID2

ID11 SubprocessID1 CharacteristicID5

这就是我正在尝试嵌套前面提到的两个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语法有错误吗?

修改

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

2 个答案:

答案 0 :(得分:1)

Length()函数返回ID中的字符数。因此,具有单个数字的ID将首先排序,依此类推......

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

答案 1 :(得分:0)

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

以下是重点

  • 你的where子句包含2个运算符(=IN),你真正想要使用哪一个?
  • 子查询返回多个列,但只应为IN运算符
  • 返回一个
  • 分号(;)位于错误的地方

我恐怕不会引用你想要达到的目标,所以我无法帮助你进行适当的修正。