【问题标题】:MySql: Select Distinct for words in different orderMySql:为不同顺序的单词选择 Distinct
【发布时间】:2019-04-13 23:32:18
【问题描述】:

我在创建查询时遇到问题,我的表中没有重复值。不幸的是,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   |
+----+-----------------------+

我的目标是创建查询,它以类似的方式获取,例如:select distinct for Name and Surname in the order in the same order.

有什么想法吗?

【问题讨论】:

  • 为什么Casey Dean Davidson改为Casey Davidson
  • 谢谢,这是我的错误;)
  • 你如何保证哪一个是正确的。我的意思是Marshall WilsonWilson Marshall?
  • 名称中是否可以包含 3 个以上的子字符串?

标签: mysql select distinct


【解决方案1】:

它需要大量的String operations,并且需要使用多个Derived Tables。它可能效率不高

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

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

现在,诀窍是将此结果集用作派生表,并对单词执行Group_Concat(),以便它们按升序排序。这样,即使是重复的名称(但子字符串的顺序不同),也会得到相似的 words_sorted 值。最后,我们只需要在words_sortedGroup 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

【讨论】:

  • 非常感谢。我知道你投入了多少工作,但我担心查询对于更大的基础来说可能太重了。
  • @fioljnw 是的,我知道性能部分。但不幸的是,在您的情况下,我觉得这是使用 MySQL 的少数可能的解决方案之一。您还可以探索全文搜索或使用专门的数据库进行这种模糊搜索,如 Apache SOLR 等
  • 你给了我很棒的主意。我添加带有全名排序子字符串的新列。以更简单快捷的方式,我将获得独特的价值。谢谢!
猜你喜欢
  • 2012-05-19
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多