从Mysql中的url列获取id
我有一个Mysql表,如下所示:从Mysql中的url列获取id,mysql,Mysql,我有一个Mysql表,如下所示: url --------------- example.com/test.php?id=5 example.com/test.php?id=6&serial=10 example.com/test.php?subsid=7 example.com/test.php?id=7&serial=10&subsid=4 example.com/test.php?subsid=9&serial=10&id=8 我想从url列中提取
url
---------------
example.com/test.php?id=5
example.com/test.php?id=6&serial=10
example.com/test.php?subsid=7
example.com/test.php?id=7&serial=10&subsid=4
example.com/test.php?subsid=9&serial=10&id=8
我想从url列中提取id。到目前为止,我已经做了以下工作:
select url,substring_index(substring_index(url, 'id=', -1),'&', 1) from thetable
但问题是第三排也有7个,我不想要。我只想得到身份证,不想补贴等等
还有一件事,我想在没有任何PHP的情况下完成它
提前感谢。在本应具有代表性的数据集上尝试了此功能
SELECT
`url`,
(CASE
WHEN `url` LIKE '%&id%' THEN SUBSTRING_INDEX(SUBSTRING_INDEX(`url`, '&id=', -1),'&', 1)
WHEN `url` LIKE '%?id%' THEN SUBSTRING_INDEX(SUBSTRING_INDEX(`url`, '?id=', -1),'&', 1)
ELSE
0
END
) as `id`
FROM `thetable`;
这可能不是最有效的方法,但它是有效的
我想出了以下解决方案。据我所知,您最大的问题是,可能在每个url中都有
id=
和subsid=
作为查询参数。这会使您的查询中断,因为您捕获了错误的id
此解决方案使用id=
将最右边的子字符串与使用subsid=
的相同子字符串进行比较。如果它们匹配,则表示我们正在查找一个subfid=
,查询将移到左侧并再次检查。我这样做了三次(您的示例URL最多只有3个查询参数),但是如果您需要3个以上的参数,您可以添加另一个嵌套的CASE
SELECT url,
CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'id=', -1),'&', 1) =
SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'subsid=', -1),'&', 1)
THEN
CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'id=', -2),'&', 1) =
SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'subsid=', -2),'&', 1)
THEN
CASE WHEN SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'id=', -3),'&', 1) =
SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'subsid=', -3),'&', 1)
THEN NULL
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'id=', -3),'&', 1)
END
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'id=', -2),'&', 1)
END
ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(url, 'id=', -1),'&', 1)
END
FROM thetable
请尝试单击下面的链接以获得实时演示
您是否将整个url保存在表中?是的,这是一个临时页面访问日志表。我添加了Fiddle(cough,cough)。他的诀窍是在尝试使用
子字符串_INDEX()
之前,先使用LIKE
过滤每条记录。很好用。谢谢你加了小提琴。这个问题是正则表达式替换函数需要存在的一个完美例子。与编写所有这些内容不同,它可以是简单的REGEXP_REPLACE(url,(&|?)id=([0-9]+),“$2”)
,并具有更好的验证。@davidfarbanks“$2”意味着什么?如果函数存在,则意味着从第二个()
中获取值。但不幸的是,mysql中还没有这个函数。