我想加入这两个表,但第二个表的连接键位于查询字符串
中 page
表,
page_id url
1 a
2 c
3 d
system
表,
system_id query
1 page_id=1&content=on&image=on
2 type=post&page_id=2&content=on
您可以看到page_id
是system
表格中查询字符串的一部分。
那么如何加入它们就像下面的标准连接表方法一样?
SELECT*
FROM page AS p
LEFT JOIN system AS s
ON p.page_id = s.page_id
修改
我可以将system
表更改为这样的内容,
system_id page_id query
1 1 page_id=1&content=on&image=on
2 2 type=post&page_id=2&content=on
3 NULL type=page
但我不想这样做的原因是page_id
不需要许多特定的记录。我不希望创建一个包含太多null
的列。
答案 0 :(得分:2)
我肯定会为page_id
,content
,image
和type
创建列(并将其编入索引)。然后,数据库将变得更轻,并且可以更快地工作。
答案 1 :(得分:1)
我建议您解压缩page_id
并将其插入数据库并使用普通联接来完成您要搜索的内容。
所以使列像
+------------+-----------+---------+
| system_id | page_id | query |
------------------------------------
这是一个片段,您可以使用它来提取page_id。
$query = 'page_id=1&content=on&image=on';
$queryParts = explode('&', $query);
$params = array();
foreach ($queryParts as $param) {
$item = explode('=', $param);
$params[$item[0]] = $item[1];
}
$page_id = $parems['page_id'];
然后你可以继续使用insert并使用简单的join语句以正确的方式解决你的问题。
更新:
因为您可以将架构更改为可行的架构。你不必担心一些行上有空行。
答案 2 :(得分:0)
我想你想要这样的东西(MSSQL!):
DECLARE @query VARCHAR(50)
DECLARE @Lenght INT
DECLARE @PageID INT
SET @query = '4kkhknmnkpage_id=231&content=on&image=on'
SET @Lenght = PATINDEX('%&%', substring(@query,PATINDEX('%page_id=%', @query),50)) - 9
SET @PageID = CAST(SUBSTRING(@query,PATINDEX('%page_id=%', @query) + 8,@Lenght) AS INT)
SELECT @PageID -- you can do as you please now :)
或者:
SELECT*
FROM page AS p
LEFT JOIN (SELECT CAST(SUBSTRING(query,PATINDEX('%page_id=%', query) + 8,(PATINDEX('%&%', substring(query,PATINDEX('%page_id=%', query),50)) - 9)) AS INT) AS page_id
FROM system) AS s
ON p.page_id = s.page_id
-- Do as you please again :)
我猜你真正想要的是这样的东西(MYSQL!):
SET @query := '4kkhknmnkpage_id=231&content=on&image=on';
SET @Lenght := POSITION('&' IN (SUBSTR(@query,POSITION('page_id=' IN @query),50))) - 9;
SET @PageID := CAST(SUBSTR(@query,POSITION('page_id=' IN @query) + 8,@Lenght) AS SIGNED );
SELECT @PageID
或
SELECT*
FROM page AS p
LEFT JOIN (SELECT CAST(SUBSTR(query,POSITION('page_id=' IN query) + 8,(POSITION('&' IN (SUBSTR(query,POSITION('page_id=' IN query),50))) - 9)) AS SIGNED) AS pageID
FROM system) AS s
ON p.page_id = s.pageID