0

ブログ システムを作成しており、ブログ投稿に「タグ」を追加したいと考えています。これらはここに表示されているタグに似ており、同様の件名の投稿をグループ化するために使用できます。

タグをコンマで区切られた単語の文字列 (空白ではない文字列) としてデータベースに保存したいと考えています。しかし、タグ A とタグ B を含むすべての投稿を検索する方法がよくわかりません。

すべてのデータを取得して PHP ループでスキャンする小さなデータベースで動作する単純なソリューションは好きではありません。これは、大規模なデータベース (数千ではないにしても数百の投稿) では機能しないためです。これほど多くのブログ投稿を行うつもりはありませんが、データベースから正しい結果を直接取得することで、システムを安定させ、PHP スクリプトの作業時間を節約したいと考えています。

私のテーブルがこのように見えるとしましょう(実際にはもう少し複雑です)

blogposts:
id   | title         | content_html                  | tags
0    | "hello world" | "<em>hello world!</em>"       | "hello,world,tag0"
1    | "bye world"   | "<strong>bye world!</strong>" | "bye,world,tag1,tag2"
2    | "hello you"   | "hello you! :&gt;"            | "hello,tag3,you"

"hello"タグだけでなく、タグを含むすべての投稿を選択するにはどうすればよい"world"ですか? 部分文字列を検索できる LIKE ステートメントについては知っていますが、複数の部分文字列で使用できますか?

4

2 に答える 2

1

意味のある方法で csv 値のフィールドにインデックスを付けることはできず、SQL は CSV 値のフィールドで一意の値を見つけることをサポートしていません。代わりに、さらに 2 つのテーブルを設定し、テーブルに次の変更を加えます。

ブログ投稿:

ID | タイトル | content_html

タグ:

ID | タグ名

分類表:

ID | blogpost_id | tag_id

ブログ投稿にタグを追加すると、分類テーブルに新しいレコードが挿入されます。データのクエリを実行すると、3 つのテーブルすべてを結合して、次のような情報を取得します。

SELECT `tag_name` FROM `blogposts` INNER JOIN `blogposts_taxonomy` ON
`blogposts`.`id`=`blogposts_taxonomy`.`blogpost_id` INNER JOIN `blogpost_tags` ON
`blogposts_taxonomy`.`tag_id`=`blogpost_tags`.`id` WHERE `blogposts`.`id` = someID;

//アップデート

N:M 関係を設定すると、アプリケーションの構築時に多くのオプションが提供されます。たとえば、すべて「php」というタグが付いたブログ投稿を検索できるようにしたいとします。次のように実行できます。

SELECT `id`,`html_content` FROM `blogposts` INNER JOIN `blogposts_taxonomy` ON
`blogposts`.`id`=`blogposts_taxonomy`.`blogpost_id` INNER JOIN `blogposts_tags` ON
`blogposts_taxonomy`.`tag_id`=`blogposts_tags`.`id` WHERE `blogposts_tags`.`tag_name`="php";

これにより、「php」タグでタグ付けされたすべてのブログ投稿が返されます。

乾杯

于 2013-11-09T01:39:41.323 に答える
0

このようなデータを本当に保存したい場合は、FIND_IN_SETmysql 関数が役に立ちます。

where句に関数を2回入れます。

しかし、それはひどく実行されます-すでに提案されているように、リンクされたテーブルを1対多のスタイルにすることは、はるかに良い考えです. 同じタグがたくさんある場合は、多対多を使用できます。「post2tag」テーブル経由。

于 2013-11-09T01:44:12.670 に答える