आप मान को अल्पविराम से अलग किए गए रूप में संग्रहीत नहीं करना चाहते हैं।
उस मामले पर विचार करें जब आप इस कॉलम को किसी अन्य तालिका के साथ जोड़ने का निर्णय लेते हैं।
मान लें कि आपके पास है,
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 abcd abcde .... के साथ पंक्तियाँ लौटाएगा।
यदि आपके पास कई उपयोगकर्ता और आइटम हैं, तो मेरा सुझाव है कि अलग तालिका बनाएं users
एक PK उपयोगकर्ता आईडी के साथ, अन्य items
पीके आइटमिड और अंत में एक मैपिंग टेबल के साथ user_item
उपयोगकर्ता आईडी, आइटम आईडी कॉलम होना।
यदि आप जानते हैं कि आपको केवल इन मानों को संग्रहीत करने और पुनर्प्राप्त करने की आवश्यकता होगी और इस पर कोई ऑपरेशन नहीं करना होगा जैसे कि शामिल होना, खोज करना, अलग करना, अलग पंक्तियों में रूपांतरण आदि। - बस हो सकता है, आप कर सकते हैं (मैं अभी भी करूँगा 'टी)।