2

因此,我一直在尝试在我的代码中将嵌套的 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 语法有什么错误吗?

编辑

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

4

2 回答 2

1

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

SELECT * FROM `Subprocess_has_Characteristic`
 WHERE `SubProcessID` = 'SubProcessID1'     
 ORDER BY LENGTH(ID), ID;
于 2017-02-11T06:51:27.183 回答
0

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

以下是重点

  • 您的 where 子句包含 2 个运算符 ( =and IN),您实际上打算使用哪一个?
  • 子查询返回多列,但应该只为IN操作员返回一列
  • 分号 ( ;) 位置错误

恐怕我无法理解您要达到的目标,因此我无法帮助您进行适当的更正。

于 2017-02-10T20:43:05.267 回答