値をコンマ区切り形式で保存したくない。
この列を他のテーブルと結合することにした場合を考えてみてください。
あなたが持っていると考えてください、
x items
1 1, 2, 3
1 1, 4
2 1
xごとに異なる値を見つけたい場合:
x items
1 1, 2, 3, 4
2 1
または、3つ含まれているかどうかを確認することもできます
または、それらを別々の行に変換したい場合があります:
x items
1 1
1 2
1 3
1 1
1 4
2 1
それは大きな苦痛になります。
少なくとも正規化の第一原理を使用します-値ごとに別々の行を用意します。
さて、元々あなたがテーブルとしてこれを持っていたとしましょう:
x item
1 1
1 2
1 3
1 1
1 4
2 1
簡単にcsv値に変換できます:
select x, group_concat(item order by item) items
from t
group by x
x=1にアイテム3があるかどうかを検索する場合。簡単。
select * from t where x = 1 and item = 3
以前の場合は恐ろしいを使用していました find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
CSV値でlikeを使用して検索できると思われる場合は、最初にlike %x%
インデックスは使用できません。次に、間違った結果が生成されます。
アイテムabが存在するかどうかを確認し、%ab%
を実行するとします。 abc abcdabcde....。
多くのユーザーとアイテムがある場合は、別のテーブルusers
を作成することをお勧めします PKユーザーID、別のitems
PKitemidと最後にマッピングテーブルuser_item
userid、itemid列があります。
これらの値を保存および取得するだけで、結合、検索、個別化、個別の行への変換などの操作を行わないことがわかっている場合は、そうすることができます(私はまだそうしません't)。