MySQL查询:使用每个结果/行来regex并计算另一个表

时间:2013-05-10 23:00:05

标签: mysql regex count

不确定这是否可行。有两个表,一个是国家代码:

e.g。

id | code | country

1    .us    United States
2    .ru    Russia

等等(约200多行)

另一个是网址:

http//:example.gov.us
http://example.gov.ru/index.php
http://xyz.gov.us/test.html

等等。

我不知道会有什么网址,所以我必须抓住每个国家/地区代码,然后以某种方式查询网址以查找与国家/地区代码匹配的内容,并计算每个网址的数量。

例如(?)

gov.[country code]

理想情况下,我希望输出按国家/地区名称进行分组并计算,例如,使用上述网址作为示例,可能会导致:

country | total

United States | 2
Russia  | 1

就像我说的那样,不确定这是否可以在MySQL中使用正则表达式,子串等进行。很想知道它是否可以。

2 个答案:

答案 0 :(得分:1)

你可以使用这样的查询:

SELECT
  c.country,
  COUNT(*)
FROM
  countries c INNER JOIN URLS u
  ON SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'http://', -1), '/', 1)
     LIKE CONCAT('%', c.code)
GROUP BY
  c.country

请参阅小提琴here

使用SUBSTRING_INDEX(url, 'http://', -1),您可以在http://

之后获取整个字符串
http://example.gov.ru/index.php  --->   example.gov.ru/index.php

然后在此字符串上使用SUBSTRING_INDEX(..., '/', 1),如果没有/

,您可以在第一个/或整个字符串之前获取字符串的一部分
example.gov.ru/index.php         --->   example.gov.ru

然后您可以检查example.gov.ru LIKE '%.ru'

答案 1 :(得分:0)

select country, count(*) total
from country_codes c
join urls on urls.url RLIKE CONCAT("^http://[^/]+\\.gov\\.", c.code, "($|/)")
group by county