我有一个带有字段name
的mysql表,它可能有如下常用条目
name
---
abc
abc.com
我想选择所有常见值,我已经编写了以下查询:
select * from table
group by name having count(*) >= 2;
这里,name基本上是服务器主机名。所以,根据定义,我需要只比较.
之前的第一个值所以,server
与server.abc.com
相同我选择0行看起来不正确
对于您的RDMS,这些不是重复值。数据库正在比较匹配的字符串和'abc' != 'abc.com'
。我想你想要的是检查多个网址,无论顶级域名(.com
,.org
等)。为此,我们可以在最后一段时间之前获取URL。
select
substr(
name
, 0
, locate('.', reverse(name))
)
, count(*)
from
table
group by
substr(
name
, 0
, locate('.', reverse(name))
)
having count(*) >= 2;
上面的代码将忽略域名,但您可能仍然遇到子域名(news.abc.com
,videos.abc.com
等)或协议指标(http
,https
等)的问题。如果你需要,我会把这些作为练习留给你。
据我所知,你创建一个查询的问题可能会对你有帮助。 由于您没有显示正确的数据库结构,因此我在表中创建了相同的方案,并根据该方式创建了查询。 例如:
选择count(c1.city_name)作为来自c1.city_name的城市c1内连接城市c2的总数LIKE CONCAT('%',c2.city_name,'%')组由c1.city_id组合,总计> 1;
尝试这样的事情,这项工作为oracle
select * from(
SELECT a.name, count(b.id) duplicates FROM table a,table b
WHERE a.name LIKE CONCAT(b.name, '%')
group by a.name
) where duplicates >=2
select name, count(name)
from (select substring(name, 1,
if(position("." in name)=0,
length(name),
position("." in name)-1)
) name
from table) t1
group by name
having count(name) >= 2;
如果您想要所有条目,请删除“有计数(名称)> = 2”