MYSQL在name列上查找公共值

时间:2017-12-22 04:53:09

标签: mysql sql join group-by

我有一个带有字段name的mysql表,其中可能包含如下所示的常用条目

name
---
abc
abc.com

我想选择所有常用值,并且我已经编写了以下查询:

select * from table
group by name having count(*) >= 2;

这里,name基本上是服务器主机名。因此,根据定义,我只需比较.之前的第一个值 因此,serverserver.abc.com相同 我选择的0行看起来不正确

4 个答案:

答案 0 :(得分: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.comvideos.abc.com等)或协议指标(httphttps,等等)。如果你需要,我会把这些作为练习留给你。

答案 1 :(得分:0)

据我所知,我创建一个查询可能会对你有所帮助 由于您没有显示正确的数据库结构,因此我在表中创建了相同的方案并按照该方式创建了查询 例如:

  

从city c1 inner join city c2中选择count(c1.city_name)作为总计   在c1.city_name上LIKE CONCAT('%',c2.city_name,'%')分组依据   总计> 1的c1.city_id;

答案 2 :(得分:0)

尝试这样的事情,这项工作适用于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

答案 3 :(得分:-1)

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"