0

私は自分のWebサイトの検索機能を作成しているので、メインテーブルからキーワードを取得し、idを介してメインテーブルにリンクするセカンダリテーブルのキーとしてこれらを要約しました。
私のセットアップは次のようになります:
-------------------------------------------- ---------
| アイテム|
-------------------------------------------------- ---
| Id | 名前| 価格|
-------------------------------------------------- ---
| 1 | CPU | 199.95 |
| 2 | GPU | 249.95 |
| 3 | GPU | 225.95 |
-------------------------------------------------- ---

----------------------------------------------- ------
| キー|
-------------------------------------------------- ---
| Id | item_name | item_id |
-------------------------------------------------- ---
| 1 | CPU | 1 |
| 2 | GPU | 2 |
| 3 | GPU | 3 |
-------------------------------------------------- ---
私のテーブルはより複雑で、行ごとに多くのキーを生成することに注意してください。
私の問題は、重複するキーワードがたくさんあると、キーワードテーブルが非常に大きくなることです。したがって、私の質問は次のとおり
です。一意のitem_nameごとにmySQLのIDをグループ化して、誰かがGPUを検索した場合、出力が2と3になるようにすることは可能ですか?
たとえば、文字列内の値を区切ることができると思います。そのようなコンマ:
--------------------------------------------- --------
| 2 | GPU | 2,3 |
-------------------------------------------------- ---
ただし、たとえば、アイテム内のアイテムが削除され、キーテーブルを更新し、文字列「1,3,5,7,10,15」からId = 5を削除する必要がある場合は、複雑になると感じます
。同じ名前のキーを複数のエントリにリンクするスマートな方法はありますか?または、値を区切るために、常に正規表現、場合によってはPHPが必要ですか?

4

1 に答える 1

0

データベース テーブルでは CSV を使用せず、代わりに結合を使用してデータを選択します。

次のように出力を生成できるはずです。

select count(*) as cnt
      ,k.item_name
      ,group_concat(k.item_id) as ids
from keys k
inner join items i ON (i.id = k.id)
where i.price = 199.95

group_concatオンザフライで CSV を生成するため、CSV をデータベースに保存する必要はありません。複数行の出力が必要な場合は、group by句を使用できます。

参照: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

これは正規表現とは何の関係もないことに注意してください。

于 2013-02-10T10:22:09.600 に答える