从Mysql中的url列获取id

时间:2015-09-22 04:31:03

标签: 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列中提取id。到目前为止,我已经完成了以下工作:

select url,substring_index(substring_index(url, 'id=', -1),'&', 1) from thetable

但问题是它第三排也得到7,我不想要。我想得到身份证明而不是补贴等。

还有一件事,我想在没有任何PHP的情况下这样做。

提前致谢。

2 个答案:

答案 0 :(得分:3)

尝试使用代表性的数据集。

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`;

这可能不是最有效的方式,但它有效。

SQLFiddle

答案 1 :(得分:0)

我提出了以下解决方案。根据我的判断,您最大的问题是,您可能会在每个网址中同时包含id= subsid=作为查询参数。这会丢掉你的查询,因为你捕获了错误的id。

此解决方案使用id=将使用subsid=的最右子字符串与使用subsid=相同子字符串进行比较。如果他们匹配,则表示我们正在查找CASE,然后查询向左移动并再次检查。我这样做了三次(您的示例网址最多只有3个查询参数),但是如果您期望超过3个参数,则可以添加另一个嵌套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

<?php
$db_host="localhost";
$db_username="root";
$db_pass="";
$db_name="saadstore";

$conn = mysql_connect($db_host, $db_username, $db_pass)or die("Could not connect to mySQL"); 
$selected = mysql_select_db($db_name, ,$conn)or die("no database");
?>

尝试点击下面的链接进行现场演示。

SQLFiddle