私はこのデータベーススキーマを持っています。単純にするために、オブジェクトにタグ付けしているものを呼び出しています。
ユーザー
- ユーザーID
- ログインする
ユーザーからオブジェクトへのテーブル(多対多)
- ユーザーID
- object_id
オブジェクトテーブル
- object_id
- object_stuff
user_idテーブルでタグ付けするオブジェクト(多くの場合、余分な列があります)
- ユーザーID
- object_id
- tag_id
タグテーブル
- tag_id
- タグ名
特定のユーザーのオブジェクトとオブジェクトのタグ(ユーザーがタグを付けている場合)を取得するために、このようなクエリを使用しています。これを最適化できると思われる場合は、遠慮なくお知らせください。
@user_id = 'whatever user_id I want';
SELECT
o.object_id AS object_id,
o.object_stuff AS object_stuff,
IF (tags.tag_name IS NOT NULL, GROUP_CONCAT(tags.tag_name SEPARATOR '|'), 'N/A') AS tags
FROM object_table AS o
LEFT OUTER JOIN obj_to_users_table AS o2u ON o.object_id = o2u.object_id
LEFT OUTER JOIN users AS u ON u.user_id = o2u.user_id
LEFT OUTER JOIN obj_to_tag_users AS o2tu ON o.object_id = o2tu.object_id AND u.user_id = o2tu.user_id
LEFT OUTER JOIN tags AS t ON t.tag_id = o2t.tag_id
WHERE u.user_id = @user_id GROUP BY o.object_id
これにより、次のような結果が得られます。
object_id object_stuff tags
1 stuff1... tag1|tag2|tag3
2 stuff2... tag4|tag6|tag1
3 stuff3... tag7|tag2|tag5
私の問題は、たとえば、「tag2」としてタグ付けされたオブジェクトを検索したいので、次のように取得する必要があることです。
object_id object_stuff tags
1 stuff1... tag1|tag2|tag3
3 stuff3... tag4|tag2|tag1
しかし、代わりに、オブジェクトに付随する他のタグを失います。
object_id object_stuff tags
1 stuff1... tag2
3 stuff3... tag2
「tag2」としてタグ付けされたオブジェクトを取得できるだけでなく、オブジェクトが結果セットに持つ他のタグも保持できるように、WHERE句を変更するにはどうすればよいですか?
... WHERE u.user_id = @user_id AND t.tag_name LIKE '%tag2%' ...