首页 > 解决方案 > 如何在 MySQL 中获取所有不包含另一个字符串的字符串?

问题描述

我有一个名为“Domains”的表,其中包含“Name”字段(唯一,始终小写),其中包含我服务器上的域和子域列表,例如:

  1. 废话.example.com
  2. www.example.com
  3. www.blah.example.com
  4. 例子.com
  5. 例子.nl
  6. 例子.org

查看此列表,名称 1、2 和 3 是第 4 项的子域。我正在寻找此表中没有这些子域的所有域。或者,更准确地说,任何名称中不包含其他记录的名称的任何名称。因此只有第 4、5 和 6 项。
如果缺少记录 4,那么此查询也会有第 1 项和第 2 项作为结果,但没有第 3 项。毕竟,第 3 项包含第 1 项。
只是试图找到可以为我提供这个结果的查询......select d.name from domains where d.name not in...好吧,我的大脑一片空白。

为什么?
这个域列表是由我的 Web 服务器生成的,它注册了在其上请求的每个新域。我正在开发一个报告页面,我将在其中显示顶级域名,以查看其中是否有任何奇怪的域。出于某种原因,我有时会在这些请求中看到未知域名,这可能会提供一些额外的见解。
我将更改我的代码,以便将来在同一个表中包含对父域的引用,但现在我必须处理这个问题和一个简单的 SQL 解决方案。

标签: mysqlselect

解决方案


使用与后缀匹配的自联接LIKE

SELECT d1.name
FROM domains AS d1
LEFT JOIN domains AS d2 ON d1.name LIKE CONCAT('%.', d2.name)
WHERE d2.name IS NULL

演示


推荐阅读