mysql:为不同顺序的单词选择distinct

vql8enpb  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(357)

我在创建查询时遇到了问题,因为在我的表中没有重复的值。不幸的是,“全名”列的名称和姓氏顺序不同。
例如:

+----+----------------------+
| 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   |
+----+-----------------------+

我的目标是创建查询,它以类似的方式获取,例如:按相同的顺序选择distinct作为名称和姓氏。
有什么想法吗?

uz75evzq

uz75evzq1#

它需要大量的字符串操作和使用多个派生表。可能效率不高。
我们首先标记 FullName 它由多个单词组成。为此,我们使用一个数字生成器表 gen . 在本例中,我假设子字符串的最大数目是3。你可以通过添加更多的选择来扩展它,比如, SELECT 4 UNION ALL .. 等等。
我们使用 Substring_Index()Replace() 函数以使用单个空格字符获取子字符串( ' ' )作为分隔符。 Trim() 用于删除所有左前导/尾随空格。
现在,技巧是使用这个结果集作为派生表,并执行 Group_Concat() 按升序排列。这样,即使是重复的名称(但子字符串的顺序不同),也会得到相似的结果 words_sorted 价值观。最终,我们只需要 Group Bywords_sorted 剔除重复的。
查询#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 |

db fiddle视图

相关问题