アイテムのアクションIDリストをコンマ区切り形式で格納するテーブルがあり、MySQLクエリを使用してIDからコンマ区切り形式の説明リストを取得したいと思います。
私は2つのテーブルを持っています:
table1: action_master table2: object_action
id action items actions_id_list
------------- ---------------------------
1 talk Human 1,2,4
2 walk Dog 3
3 bark Fish 4,5
4 eat
5 swim
ここで、次のように出力を生成できるselectクエリを記述します。
items actions_desc_list
-----------------------------
Human talk,walk,eat
Dog bark
Fish eat,swim
注:アクションの説明リストをobject_actionテーブルに直接保存するオプションはありません。IDを使用する必要があります。
状況の一般的な考慮事項
カンマ区切りのリストを値として列に格納しないでください。これにより、データベースの通常のフォームが壊れます。あなたはnormalization
プロセスについて考える必要があります。現在問題が発生している理由は、最初にコンマ区切りのリストがこのように設計されているためです。FOREIGN KEY
ここにも制約を作成する適切な方法がないことに注意してください。
解決
とはいえ、スキーマの再設計を実行できない可能性が高いため(可能であれば、少なくとも将来の問題を回避できる人に通知してください)FIND_IN_SET
、MySQL関数をJOIN
条件として使用し、次にGROUP_CONCAT
結果を使用できます。
FIND_IN_SET(f1, f2)
f1
文字列内のf2
文字列の位置を返します。の状態に> 0
するとTRUE
、f1
内に存在する場合に戻りますf2
。
あなたの場合:
f1 == action_master.id
f2 == object_action.actions_id_list
サンプルデータ
create table action_master( id int, action varchar(10));
create table object_action (items varchar(10), actions_id_list varchar(15));
insert into action_master values (1,'talk'), (2,'walk'), (3,'bark'), (4,'eat'), (5,'swim');
insert into object_action values ('Human','1,2,4'),('Dog','3'),('Fish','4,5');
結果を生成するためのクエリ
select
oa.items
, group_concat(am.action order by am.id) as actions_desc_list
from object_action oa
inner join action_master am on
find_in_set(am.id, oa.actions_id_list) > 0
group by oa.items
結果
items actions_desc_list
-------------------------
Dog bark
Fish eat,swim
Human talk,walk,eat
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加