从Mysql中的url列获取id

从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列中提取

我有一个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列中提取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中还没有这个函数。