MySQL 8 通过使用 FIELD 或 FIND_IN_SET 函数未按预期返回结果来排序

问题描述 投票:0回答:0

我一直为这件事伤透了脑筋。如果我执行查询并使用“Order By 2;”例如,一切都按预期进行,数据在第 2 列上排序。一旦我将变量设置为 2 并将其用作“Order By @columnIndex;”数据未排序。如果我将 Order by 子句与 FIELD() 函数或 FIND_IN_SET() 函数一起使用,则数据不会排序。为什么?

突出我创建的快速表格。

CREATE TABLE `account` (
  `id` int NOT NULL AUTO_INCREMENT,
  `fullname` varchar(102) GENERATED ALWAYS AS (concat(`familyname`,_utf8mb4', ',`givenname`)) STORED,
  `email` varchar(50) NOT NULL,
  `suspended` tinyint DEFAULT '0',
  `givenname` varchar(50) DEFAULT NULL,
  `familyname` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`email`),
  UNIQUE KEY `id_UNIQUE` (`id`),
  KEY `id_index` (`fullname`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; 

-- 执行此查询不会对结果进行排序。 FIELD 函数返回索引 2。

选择

id
fullname
email
suspended
FROM
account
按字段排序('全名', 'id','全名','电子邮件','暂停') DESC

  1. 行 ID:3 全名:z,z 电子邮件:ab 暂停:0
  2. 行 ID:2 全名:b,b 电子邮件:bfa 暂停:0
  3. 行 ID:5 全名:c,c 电子邮件:ca 暂停:0
  4. 行 ID:4 全名:x,x 电子邮件:faa 暂停:1
  5. 行 ID:7 全名:d,d 电子邮件:ga 暂停:1
  6. 行 ID:6 全名:f,f 电子邮件:ua 暂停:0
  7. 行 ID:1 全名:a,电子邮件:za 暂停:1
  8. 行 ID:NULL 全名:NULL 电子邮件:NULL 暂停:NULL 一组 8 行

-- 执行此查询确实按预期对结果进行排序

id
中选择
fullname
email
suspended
account
按 2 个 DESC

排序
  1. 行 ID:3 全名:z,z 电子邮件:ab 暂停:0
  2. 行 ID:4 全名:x,x 电子邮件:faa 暂停:1
  3. 行 ID:6 全名:f,f 电子邮件:ua 暂停:0
  4. 行 ID:7 全名:d,d 电子邮件:ga 暂停:1
  5. 行 ID:5 全名:c,c 电子邮件:ca 暂停:0
  6. 行 ID:2 全名:b,b 电子邮件:bfa 暂停:0
  7. 行 ID:1 全名:a,电子邮件:za 暂停:1
  8. 行 ID:NULL 全名:NULL 电子邮件:NULL 暂停:NULL 一组 8 行

我也尝试使用 FIND_IN_SET 函数解决此问题,但结果也未排序。

这可能与主键不是 id 或者生成的列有关吗?

有人可以向我解释一下我做错了什么吗?

mysql sql-order-by field find-in-set
© www.soinside.com 2019 - 2024. All rights reserved.