Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连接两个表,但连接键位于查询字符串中_Php_Mysql_Sql_Left Join - Fatal编程技术网

Php 连接两个表,但连接键位于查询字符串中

Php 连接两个表,但连接键位于查询字符串中,php,mysql,sql,left-join,Php,Mysql,Sql,Left Join,我想联接这两个表,但第二个表的联接键位于查询字符串中 页面表格 page_id url 1 a 2 c 3 d system_id query 1 page_id=1&content=on&image=on 2 type=post&page_id=2&content=on 系统表 page_id url 1

我想联接这两个表,但第二个表的联接键位于查询字符串中

页面
表格

page_id     url
1           a
2           c
3           d
system_id       query
1               page_id=1&content=on&image=on
2               type=post&page_id=2&content=on
系统

page_id     url
1           a
2           c
3           d
system_id       query
1               page_id=1&content=on&image=on
2               type=post&page_id=2&content=on
正如您所看到的,
page\u id
system
表中查询字符串的一部分

那么,我如何像下面的标准联接表方法那样联接它们呢

SELECT*
FROM page AS p

LEFT JOIN system AS s
ON p.page_id = s.page_id
编辑:

我可以将
系统
表更改为这样的内容

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\u id
不需要很多特定的记录。我不想让一个列包含太多的
null

在没有公共字段和数据类型的情况下连接两个表,这从根本上讲是错误的。 我建议您提取
page\u id
并将其插入数据库,然后使用普通连接来完成搜索

所以让这些柱子像

+------------+-----------+---------+
| system_id  |  page_id  |  query  |
------------------------------------
下面是一个用于提取页面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语句以适当的方式解决问题


更新:


因为您可以将模式更改为可行的模式。您不必担心某些行上有空行。

我肯定会为
页面id
内容
图像
类型
(并将它们编入索引)创建列。这样,数据库就会更轻,工作速度也会更快。

我想你想要这样的东西(MSSQL!):



或:


我猜你真正想要的是这样的东西(MYSQL!):





您不能用第三列预处理系统表,以便在insert时设置正确的页面id。然后您可以得到一个干净的连接,并且不会出现性能问题。是否有机会更改架构?谢谢您的回答,但我收到了这个错误,
\1064-您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以了解在第3行的system LIMIT 0,30'中使用near'INT)作为页面id的正确语法
我认为问题来自
PATINDEX
,因为如果我简化您的查询
#1305-函数mydb.PATINDEX不存在
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