2012-03-21 12 views
2

私はカスタム作業ブログを持っています。すべてうまくいきますmysqlデータベースからタグを含む記事を選択するより良い方法を知っている人がいるかどうか疑問に思っていました。タグでブログ記事を選択

現在、タグは「ブログ」テーブルの「blog_tags」に格納され、記事はLIKE '%tag%'を使用して後退します。私は同じ単語を含む2つのタグがあるまでうまくいった。ウェブサイトとウェブサイトのデザイン。

ウェブサイトのようなタグを検索して上記の方法を使用すると、ウェブサイトのタグとウェブサイトのデザインを含む結果が得られます。

解決策を修正するために、各タグの先頭と末尾に「*」を追加して、blog_tagsが* tag 1 *、* tag 2 *、* tag 3 *、*のように見えるようにしました...

ここでは、 '%* tag here *%'のようなblog_tagsで記事を検索します。これは完全に機能しますが、おそらくより良い方法があります。何か案は?

現在使用クエリは次のとおりです。

"SELECT * FROM `blog` WHERE `active` = 'y' AND `blog_tags` LIKE '%*" . str_replace("-", " ", $tag) . "*%' ORDER BY `blog_created` DESC LIMIT " . $startfrom . "," . $limit 

は事前にありがとう!

答えて

1

データベースに複数値のフィールドを設定しないでください。あなたの例を考えれば、多くのブログに対応する多くのタグとタグを持つブログがあるようです。これは多対多の関係です。

多対多リレーションシップは新しいテーブルを生成します。したがって、使用するデータベーススキーマは次のようになります。

 
Blogs(*Id*, activ, date_created) 
Tags(*Id*, text) 
Blog_Tag(*BlogId*, *TagId*) 

アスタリスクの間に主キーが表示されます。

あなたは「mysqlの」でタグ付けされたすべてのブログを検索したいのであれば、あなたは次のような何かをするだろう:あなたは、事前にタグIDを知っていれば、あなたが参加する必要はありません、

もちろん
select * from blogs b 
join blog_tag bt on b.id = bt.blogid 
join tags t on bt.tagid = t.id 
where t.text = 'mysql' 

タグ。

これがいくつかの疑問を解決しました。

3

あなたにはリレーショナルデータベースがあります。構造化されたデータを格納するように設計されています。あなた自身の構造を作り出し、それらをフィールドに格納しないでください。

これは標準many to many relationshipです。

テーブル「タグ」と、両方の外部キー(タグIDとブログエントリID)である2つの列を持つ関連テーブルを作成します。

次に、関心のあるエントリを取得するためにJOINを使用します。

関連する問題