我在创建查询时遇到问题,它没有从我的表中获取重复值。不幸的是,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 |
关于MySql:为不同顺序的单词选择不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53241947/