2016-11-10 49 views
1

LIKE操作符的select count我已經定義了這些表:與在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)); 

而且我想算爲每個域多少網址。我試圖這樣做:

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

但沒有運氣。有語法錯誤。 如何做正確的?

回答

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

提取URL中的域名將避免匹配的域中出現在路徑或查詢字符串部分。

+1

我剛剛做了一些與split_part的實驗,我認爲你想要3,而不是1。對於'http:// example.com'' split(url,'/',1)'返回'http:'。 'split(url,'/',3)'返回'example.com'。總的來說,如果數據總是包含一個完全形成的模式,我認爲你的答案比我好,而如果數據可能是'http:// example.com'和'example.com'的混合數據,我的答案會更好。 –

+0

@AndyNichols你是對的。用1這個查詢不會返回任何東西,但當我將它更改爲3時,這運行正常 – user2975535

+0

@AndyNichols是的,我沒有想到該協議。如果協議在某些url中缺失,那麼最好的選擇是'regexp_split_to_array'函數 –

2

您需要在表格之間進行連接,然後按域名進行分組。這導致

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 

這將不會給任何在url表中有零條目的域的行。如果你需要這些行改變INNER JOINLEFT OUTER JOIN