【问题标题】:MYSQL finding common values on name columnMYSQL 在名称列上查找常用值
【发布时间】:2017-12-22 04:53:09
【问题描述】:

我有一个带有 name 字段的 mysql 表,它可能有如下常见条目

name
---
abc
abc.com

我想选择所有常见的值,我已经写了下面的查询:

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

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

【问题讨论】:

  • abc 和 abc.com 是否被视为重复项?
  • 您需要详细说明“重复”的定义,因为 abcabc.com 通常不会被视为相同的值

标签: mysql sql join group-by


【解决方案1】:

对于您的 RDMS,这些不是重复值。数据库正在比较匹配的字符串和'abc' != 'abc.com'。我假设您想要的是检查多个 url,而不管顶级域(.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 等)的问题。如果您需要,我会将这些留作练习。

【讨论】:

    【解决方案2】:

    据我了解您的问题,我创建了一个查询可能会对您有所帮助。
    由于您没有显示正确的数据库结构,因此我在表中创建了相同的场景并根据该场景创建了查询。
    例如:

    select count(c1.city_name) 作为来自城市 c1 内连接城市 c2 的总数 在 c1.city_name LIKE CONCAT('%', c2.city_name, '%') 上分组 c1.city_id 的总数 >1;

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        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”

        【讨论】:

          猜你喜欢
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          相关资源
          最近更新 更多