0

コンマで区切られた複数の値を入力できる列があるテーブルnewsarchiveがあります。tagsで指定したタグに一致するニュースが表示されるページがありますnewsarchive.tags。ページ内のタグは、複数の値を持つこともできます。

タグに一致するレコードを page から取得したいと思いますnewsarchive.tags。結果を達成するための SQL ステートメントはありますか?


CREATE TABLE newsarchive ( 
    newsid int(11) NOT NULL auto_increment, 
    headline text NOT NULL, 
    article text NOT NULL, 
    pdate date NOT NULL default '0000-00-00', 
    tags text NOT NULL, 
    PRIMARY KEY (newsid) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=107 ;

newsarchive.tags of record#1="Nepal, Everest, Kathmandu"

newsarchive.tags of record#2="Kathmandu,Pokhara"

newsarchive.tags of record#3="Everest,Pokhara"

tags(in page)="Nepal, Kathmandu"

結果は次のようになります。

record#1
record#2

私は次のSELECTステートメントを使用してINいます

SELECT * FROM newsarchive WHERE tags IN ('Nepal','Kathmandu') ORDER BY postdate;

ノート:

最もタグが一致したレコードが最初に表示されると嬉しいです。

4

2 に答える 2

0

を使用しwhere tags inても、シナリオでは機能しません。

最善の方法は、外部キーを介してレコードにリンクされた関連テーブルにこれらのタグを配置することです。

スキーマを変更する機能がなく、それをサポートする RDBMS システムを使用している場合は、MySQL または ( SQL Server リンクはこちら) で全文検索を調べて、区切り文字列を検索する必要があります。

全文以外では、区切り文字 (この場合はコンマ) で文字列を分割し、一時テーブル、テーブル変数、またはその他の手段で個別に検索する必要があります。SQL Server で大まかな概念に従って、区切り文字列を検索するxml のアプローチを見てきました。

MySQL では、独自の文字列分割関数を作成する必要がある場合があります。リンクされた質問への回答を読んで、MySQL で分割する方法の例を確認してください。

複数の値のデータを 1 つの列に格納する必要がある場合 (推奨されません)、通常は区切り文字列よりも XML の方が適しています。MySQL は、xpath クエリなどのサポートを提供します。

于 2013-03-29T16:19:42.693 に答える
0

データの構造が不十分です。次のようなテーブルが必要です。

CREATE TABLE newstags ( 
    newstagsid int(11) NOT NULL auto_increment,
    newsid int(11) not null,
    tag text not null 
    PRIMARY KEY (newstagsid)
)

これは、ストーリーごとに 1 つのタグを持ちます。さらに良い構造は、タグを別のテーブルに格納し、tagid代わりにここで使用することですtag

しかし、あなたはそれを持っていません。あなたは何ができますか?php で使用して入力されたタグを解析できます。次に、次の条件で SQL ステートメントを作成します。

(concat(',', tags, ',') like concat('%,', USERTAGS1, '%,') or
 concat(',', tags, ',') like concat('%,', USERTAGS2, '%,') or
 . . .
 concat(',', tags, ',') like concat('%,', USERTAGSn, '%,')
)

もう 1 つの方法は、タグに全文索引を作成してから を使用することcontainsです。

于 2013-03-29T17:05:15.453 に答える