2015-09-07 50 views
0

想象一下,有包含用戶點擊的點擊表。現在我想選擇每個社交網絡的總點擊次數:SELECT語句中匹配的REGEXP模式

UPD: refererHost列包含任何referer主機,不僅包含社交網絡主機。

SELECT 
     c.refererHost as referer, 
     COUNT(c.id) as clicks 
    FROM clicks c 
    WHERE c.referrerHost REGEXP 'facebook|google|linkedin' 
    GROUP BY referer 
    ORDER BY clicks desc 

但問題是,引薦字段將包含域名像www.facebook.com,我需要選擇匹配正則表達式的值(例如「實」)。是否可以用MySQL來做到這一點?

+0

我不認爲這是可能的。根據文檔「如果expr匹配pat返回1,否則返回0」。 https://dev.mysql.com/doc/refman/5.5/en/regexp.html –

+0

你可以使用REGEX_SUBSTR。 SELECT REGEXP_SUBSTR(「http://theDomain/www.facebook.de」,'facebook | google | linkedin');它只返回名字。 –

+0

@BerndBuffen這是一個Oracle SQL函數..我不認爲有一個MySQL的等價物,恐怕 – Arth

回答

1

起初,我想擺脫REGEXP完全的,並與去:

SELECT CASE 
      WHEN c.referrerHost LIKE '%facebook%' THEN 'facebook' 
      WHEN c.referrerHost LIKE '%google%' THEN 'google' 
      WHEN c.referrerHost LIKE '%linkedin%' THEN 'linkedin' 
     END referrer, 
     COUNT(c.id) as clicks 
    FROM clicks c 
    WHERE c.referrerHost LIKE '%facebook%' 
     OR c.referrerHost LIKE '%google%' 
     OR c.referrerHost LIKE '%linkedin%' 
GROUP BY referer 
ORDER BY clicks desc 

我相當肯定你會得到更好的性能,但是你可以基準如果需要的話。


理想的,但是,我會忍不住建立與表中的正確轉診制度:

  • 引薦 - ID,主機,標題
  • 點擊 - ID,referrer_id

如果您控制網址,您可以計算出進入您網站的推薦鏈接,並輕鬆配置referrer_id。

那麼你的SQL變爲:

SELECT r.title as referer, 
     COUNT(c.id) as clicks 
    FROM clicks c 
    JOIN referrer r 
     ON r.id = c.referrer_id 
GROUP BY referer 
ORDER BY clicks desc 
+1

我遇到的一個問題是:我在數據庫中有「referer」字段,所以按原始字段分組,不按CASE ... END語句生成引用字段。重命名字段爲「ref」幫助了我。 –