2

これらの2つのテーブルを結合したいのですが、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

編集:

私はdefが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_id(そしてcontentそれらにインデックスを付けます)。そうすれば、データベースははるかに軽量になり、はるかに高速に動作します。imagetype

于 2012-05-01T03:02:46.803 に答える
1

共通のフィールドとデータ型なしで2つのテーブルを結合することは、根本的に間違った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 に答える