MySql:为不同顺序的单词选择不同

标签 mysql select distinct

我在创建查询时遇到问题,它没有从我的表中获取重复值。不幸的是,Full Name 列的 Name 和 Surname 的顺序不同。

例如:

+----+----------------------+
| ID | Full Name            |
+----+----------------------+
| 1  | Marshall Wilson      |
| 2  | Wilson Marshall      |
| 3  | Lori Hill            |
| 4  | Hill Lori            |
| 5  | Casey Dean Davidson  |
| 6  | Davidson Casey Dean  |
+----+----------------------+

我想得到那个结果:

+----+-----------------------+
| ID | Full Name             |
+----+-----------------------+
| 1  | Marshall Wilson       |
| 3  | Lori Hill             |
| 5  | Casey Dean Davidson   |
+----+-----------------------+

我的目标是创建以类似方式获取的查询,例如:以相同的顺序为姓名和姓氏选择不同的

有什么想法吗?

最佳答案

它需要很多 String operations , 以及多个 Derived Tables 的用法.它可能效率不高

我们首先标记 FullName 成多个单词。为此,我们使用数字生成器表 gen。在这种情况下,我假设最大子字符串数为 3。您可以通过添加更多选择轻松地进一步扩展它,例如 SELECT 4 UNION ALL .. 等等。

我们使用 Substring_Index()Replace()使用单个空格字符 (' ') 作为分隔符来获取子字符串的函数。 Trim()用于删除任何前导/尾随空格。

现在,诀窍是将此结果集用作派生表,并执行 Group_Concat()在单词上,以便它们按升序排序。这样,即使是重复的名称(但子串的顺序不同),也会得到相似的 words_sorted 值。最终,我们只需要对 words_sorted 进行 Group By 以清除重复项。


查询#1

SELECT 
  MIN(dt2.ID) AS ID, 
  MIN(dt2.FullName) AS FullName 
FROM 
(
SELECT 
  dt1.ID, 
  dt1.FullName, 
  GROUP_CONCAT(IF(word = '', NULL, word) ORDER BY word ASC) words_sorted 
FROM 
(
SELECT e.ID, 
       e.FullName, 
       TRIM(REPLACE(
         SUBSTRING_INDEX(e.FullName, ' ', gen.idx), 
         SUBSTRING_INDEX(e.FullName, ' ', gen.idx-1),
         '')) AS word 
FROM employees AS e
CROSS JOIN (SELECT 1 AS idx UNION ALL 
            SELECT 2 UNION ALL 
            SELECT 3) AS gen -- You can add more numbers if more than 3 substrings
) AS dt1 
GROUP BY dt1.ID, dt1.FullName
) AS dt2
GROUP BY dt2.words_sorted
ORDER BY ID;

| ID  | FullName            |
| --- | ------------------- |
| 1   | Marshall Wilson     |
| 3   | Hill Lori           |
| 5   | Casey Dean Davidson |

View on DB Fiddle

关于MySql:为不同顺序的单词选择不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53241947/

相关文章:

php - 回显 SELECT COUNT(*) 查询的结果

mysql - SQL Server - (AdventureWorks) 列出没有产品的供应商

MySQL: ', `、´ 和 "之间的区别

php - json解码函数后奇怪的sql插入

javascript - 使用 href 中的 onclick 更改选择列表的值

javascript - Mongo 和 Node js 的查询返回不重复、不同

SQLite 外部查询返回在内部查询中找不到的结果

java - 如何更改 netbeans 中不可编辑/生成的代码

mysql - 具有唯一约束功能的 Knex.js 迁移

mysql - SELECT DISTINCT 并计数