2017-12-22 4 views
-1

ich eine MySQL-Tabelle name mit einem Feld haben, die gemeinsame Einträge wie die Abfrage unter untenMYSQL Suche nach gemeinsamen Werten auf Namensspalte

name 
--- 
abc 
abc.com 

Ich möchte alle gemeinsamen Werte wählen, und ich habe haben könnten geschrieben:

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

Hier ist der Name im Grunde Server Hostname. So, wie per Definition, ich brauche nur den ersten Wert zu vergleichen, bevor . So server gleiche wie server.abc.com Ich erhalte 0 Zeilen ausgewählt, die nicht richtig sehen

+4

Sind abc und abc.com als Duplikate? –

+3

Sie müssen Ihre Definition von "duplizieren" näher ausführen, da 'abc' und' abc.com' normalerweise nicht als die gleichen Werte angesehen werden –

Antwort

-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; 

, wenn Sie alle Einträge mögen, Entfernen "mit Anzahl (Name)> = 2"

0

Zu Ihrem RDMS sind dies keine doppelten Werte. Die Datenbank vergleicht übereinstimmende Zeichenfolgen und 'abc' != 'abc.com'. Ich gehe davon aus, dass Sie nach mehreren URLs suchen, unabhängig von der Top-Level-Domain (.com, .org, usw.). Um dies zu tun, können wir die URL vor dem letzten Zeitraum abrufen.

select 
    substr(
    name 
    , 0 
    , locate('.', reverse(name)) 
) 
    , count(*) 
from 
    table 
group by 
    substr(
    name 
    , 0 
    , locate('.', reverse(name)) 
) 
having count(*) >= 2; 

Der obige Code wird die Domain außer Acht lassen, aber Sie können noch mit Sub-Domains haben Probleme (news.abc.com, videos.abc.com, usw.) oder protocal Indikatoren (http, https, etc). Ich werde diese als Übung für Sie zurücklassen, sollten Sie sie brauchen.

0

Soweit ich Ihre Frage verstehe, habe ich eine Abfrage erstellt, kann es Ihnen helfen.
Da Sie keine korrekte Datenbankstruktur angezeigt haben, habe ich das gleiche Szenario in einer Tabelle erstellt und eine Abfrage entsprechend erstellt.
Eg:

SELECT COUNT (c1.city_name) als Summen von Stadt c1 Innenstadt c2 auf c1.city_name CONCAT LIKE ('%', c2.city_name, '%') Gruppe von c1 beitreten .city_id mit Summen> 1;

0

versuchen so etwas wie dies, diese Arbeit für Orakel

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 
Verwandte Themen