我有一个像这样的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的情况下这样做。
提前致谢。
答案 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`;
这可能不是最有效的方式,但它有效。
答案 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");
?>
尝试点击下面的链接进行现场演示。