人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

php & MySQL

作成している掲示板にタグ機能をつけたいと思っています。以前はユーザーごとにタグをスペースで区切り、入力してもらいそれを毎回新しいレコードを作製し userid にユーザー名を day に日にちを topicsid に掲示板レス番号を tags にタグを半角スペース1つで区切ったものを全て格納していました。

それで、 hatena というタグを選択した際、tags にhatenaという単語が入っている全ての topicsid を表示し関連のあるスレを表示できるようにしていました。SQLは SELECT * FROM `tag` WHERE `day` = '".$today."' AND (`tags` = '".$tag."' OR `tags` LIKE '".$tag." %' OR `tags` LIKE '% ".$tag." %' OR `tags` LIKE '% ".$tag."'); です。

しかしこの方法だとDB上には格納されているにもかかわらず、1つのレコードにスペースで区切られたたくさんのタグが入っている場合や、長いタグや、韓国語や中国語などのタグがしっかりと選択されません。なにかいいタグシステムの方法はないでしょうか?

よろしくお願いします。

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Hatena MySQL PHP SELECT tag
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● katsube
●25ポイント

DBでは縦持ちに変更すると言う方法は検討済みでしょうか?

○入力

タグ=aa bb cc

記事ID=111111


○処理

入力されたタグをスペースで分割し、それぞれINSERTする。

※テキストファイルに記録し、バッチ(cron)で

10分に1回程度インポートという手もあります。

○DB

タグ | 記事ID

--------------

aa | 111111

bb | 111111

cc | 111111


で、以下のように検索、

select distinct 記事ID from table_name where タグ='aa'

◎質問者からの返答

katsubeさんありがとうございました。早速実装してみたいと思います。


2 ●
●27ポイント

以前、少し似ている質問があり、回答したのですが、そちらが参考になると思います。

一度確認してみてください。

考え方はid:katsubeさんと同様です。

検索時の負荷はより小さくなります。

(検索はできるだけLIKEを使わずに完全一致で行うような仕組みを考えるとINDEXが活きてきます。)

参考になれば幸いです。

◎質問者からの返答

いつもありがとうございます。

早速実装してみたんですが、別のtag用テーブルとメインデータを格納しているbbsテーブルがあります。

各トピックすを表示する際、while()を使い

$sql = "select * from table_name...."

...

while ($row = mysql_fetch_object($res)) {

echo $row->topics_name"
";

echo $row->id;

}

のようにbbsのテーブルにあるデータは表示できるのですが、tagは別のテーブルなのでこれを同時に同じところに表示するにはどうすればいいのでしょうか?

よろしくお願いいたします。


3 ●
●38ポイント ベストアンサー

方法は2つあります。


1つ目は、whileの繰り返しの中でtag用のテーブルにアクセスし、bbsのidに紐付くtagを取得する方法です。

(前提条件として、tag用のテーブルにbbsのidが含まれている必要があります。)

bbsテーブルから取得した$row->idを検索条件としてtagテーブルにSELECTを発行し、関連するtag情報を取得します。

ただし、この方法ではDBへのアクセス(SELECTの発行)が1投稿の表示につき1回発生することになり、速度低下の可能性が高いです。


2つ目は、tag用のテーブルに加えてbbs用のテーブルにもtagの情報を持つ方法です。

投稿の登録時に以下のように2つのテーブルにtagの情報を書き込んでおきます。

この場合、一覧表示時には、bbsテーブルからtag情報を取得します。

この方法であれば、DBへのアクセス回数を抑えることができます。

ただし、tag情報が1つの列にまとめて格納されておりますので、DBからデータを取得後、分割、置換(ハイパーリンクの設定)などを行う必要はあります。

また、tagをキーにして情報を取得したい場合は、tag用のテーブルから情報を取得します。


試していないのではずしているかもしれませんが、1つ目よりも2つ目の方が少なくとも一覧表示は速いと思います。

参考になれば幸いです。

◎質問者からの返答

なるほど、早速試してみたいと思います。

ありがとうございました。


4 ● 堺ちゃん
●0ポイント

区切りを半角スペース以外にしちゃダメですか?

カンマとかタブ(¥t)とか<>とか

◎質問者からの返答

え?

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ