2016-11-10 4 views
1

Ich habe diese Tabellen definiert:Wählen Zählung mit LIKE-Operator in Postgresql

CREATE TABLE domain (
    id   BIGSERIAL NOT NULL, 
    name  varchar(255) NOT NULL, 
    PRIMARY KEY (id)); 

CREATE TABLE url (
    id   BIGSERIAL NOT NULL, 
    url  text NOT NULL, 
    PRIMARY KEY (id)); 

Und ich will für jede Domain, wie viele URLs zählen. Ich versuche, dies so zu tun:

SELECT 
    domain.name AS dn, 
    SELECT COUNT(*) FROM url WHERE url.url ILIKE '%' || dn || '%' 

aber ohne Glück. Syntaxfehler. Wie man es richtig macht?

Antwort

1
select d.name, count(*) 
from 
    domain d 
    inner join 
    url u on split_part(u.url, '/', 3) like '%' || d.name 
group by 1 

ändern Extrahierung werden Streichhölzer vermeiden, wo die Domain in dem Pfad oder Query-String-Teile angezeigt.

+1

Ich habe gerade ein wenig experimentiert mit split_part und ich denke, Sie wollen, 3 eher als, 1. Für 'http: // example.com'' split (URL, '/', 1) gibt '' 'http:' zurück. 'split (url, '/', 3)' gibt 'example.com' zurück. Insgesamt denke ich, Ihre Antwort ist besser als meine, wenn die Daten immer ein voll ausgebildetes Schema enthalten, wohingegen meine Antwort besser ist, wenn die Daten eine Mischung aus "http: // beispiel.de" und "beispiel.de" sein könnten. –

+0

@AndyNichols Sie haben Recht. Mit 1 liefert diese Abfrage nichts zurück, aber wenn ich sie auf 3 ändere, läuft das einwandfrei. – user2975535

+0

@AndyNichols Ja, ich habe nicht an das Protokoll gedacht. Wenn das Protokoll in einigen der URLs fehlt, wäre die beste Option die Funktion "regexp_split_to_array" –

2

Sie müssen eine Verknüpfung zwischen den Tabellen erstellen und dann nach dem Domänennamen gruppieren. Dies führt zu

SELECT d.name as dn, COUNT(*) as number_of_urls 
FROM domain d 
INNER JOIN url u ON u.url ILIKE '%'||d.name||'%' 
GROUP BY d.name 

Dies wird keine Zeile für alle Domänen mit Null-Einträge in der URL-Tabelle geben. Wenn Sie diese Zeilen die INNER JOIN zu einem der Domäne aus der URL LEFT OUTER JOIN

Verwandte Themen