2015-09-07 51 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”帮助了我。 –