2

我想加入这两个表,但第二个表的连接键在查询字符串中,

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

4

3 回答 3

2

我肯定会为page_idcontent和(image并将type它们编入索引)创建列。然后数据库会更轻,工作速度也会更快。

于 2012-05-01T03:02:46.803 回答
1

连接两个没有公共字段和数据类型的表,从根本上是错误的 IMO。

我建议您提取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'];

然后您可以继续插入并使用简单的连接语句以正确的方式解决您的问题。


更新:

因为您能够将架构更改为可行的架构。您不必担心某些行在此上有空行。

于 2012-05-01T02:55:10.373 回答
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 
于 2012-05-01T03:53:30.713 回答