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

Posted

技术标签:

【中文标题】嵌套 MySQL 查询和字母数字排序【英文标题】:Nested MySQL Queries and Alphanumeric Ordering 【发布时间】:2017-06-29 07:34:52 【问题描述】:

所以,我一直在尝试在我的代码中结合使用嵌套的 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 个字符从 order by bcd,num;) 更改为 order by bcd,num); 【参考方案1】:

Length()函数返回ID中的字符个数,所以个位数的ID会先排序,以此类推...

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

【讨论】:

第一个查询似乎没有按正确的顺序排列元素。不过,您的第二个查询 100% 有效!【参考方案2】:

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

以下是重点

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

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

【讨论】:

我编辑了这篇文章,希望能让问题更容易理解。更正了 (;),我不太确定我是否理解 WHERE 子句的 2 个运算符的问题,因为 = 用于第一个查询,IN 用于介绍嵌套查询。尝试将IN 替换为嵌套其他查询的FROM (),但这似乎没有帮助。

以上是关于嵌套 MySQL 查询和字母数字排序的主要内容,如果未能解决你的问题,请参考以下文章

sql语句 嵌套查询 排序

mysql_数据查询_嵌套查询

在嵌套 SQL 查询中排序

Mysql按多行总和/或嵌套总和排序?

如何在pyspark中按字母顺序对嵌套结构的列进行排序?

如何从 MySQL 中的数字键嵌套 JSON 字段中提取值