2017-08-07 48 views
0

我有兩個表,需要使用兩個相似的列來連接它們。PostgreSQL - 使用模式匹配連接表

第一個表被稱爲文章有一個名爲'slug'的文章的段落線,例如:'特朗普 - 失敗 - 再次。

第二個表被稱爲日誌,並有一個名爲與文章的URL路徑路徑列,例如:「/用品/王牌 - 失敗 - 尚未再次/」

這裏是我的搜索查詢:

"SELECT articles.title, count(*) as num FROM articles, log WHERE articles.slug LIKE CONCAT('%',log.path) GROUP BY articles.title;" 

這將返回什麼,但括號[]

我也曾嘗試:

"SELECT articles.title, count(*) as num FROM articles JOIN log ON articles.slug SIMILAR TO CONCAT('%',log.path) GROUP BY articles.title;" 

返回一個DataError:無效正則表達式:量詞操作數無效

任何幫助非常感謝!

+0

我很困惑,當你支付模式匹配,你的意思是你只想在連接條件中用' - '替換空格? –

+0

我需要將slug行匹配到/ articles/ – JTP709

回答

0

您在路徑的末尾有一個斜槓。這個怎麼樣?

SELECT a.title, count(*) as num 
FROM articles a JOIN 
    log l 
    ON a.path LIKE '%' || l.slug || '%' 
GROUP BY a.title; 

您還應該學會使用正確的,顯式的JOIN語法。 從不FROM條款中使用逗號。

+0

之後的日誌路徑。它不返回錯誤,但仍然只返回一個包含0行的表。 – JTP709

+0

@ JTP709。 。 。邏輯倒退了。 'slug'應該是這種模式。 –

0

因爲有一個1:1的功能有了這個,你可以做到這一點

SELECT articles.title, count(*) as num 
FROM articles 
JOIN log ON articles.slug = '/articles/' || articles.slug || '/' 
GROUP BY articles.title; 

甚至更​​好

CREATE FUNCTION slug_to_article_path(slug text) 
RETURNS text AS 
$$ 
    SELECT '/articles/' || slug || '/'; 
$$ LANGUAGE sql 
IMMUTABLE; 

SELECT articles.title, count(*) as num 
FROM articles 
JOIN log ON articles.slug = slug_to_article_path(articles.slug) 
GROUP BY articles.title; 
0

試試這個:

` select articles.title, count(*) as views from articles 
    join log on articles.slug ~~ ('%' || articles.slug || '%') 
    group by articles.title;`