Non vuoi memorizzare il valore nel modulo separato da virgole.
Considera il caso in cui decidi di unire questa colonna con qualche altra tabella.
Considera di averlo fatto,
x items
1 1, 2, 3
1 1, 4
2 1
e vuoi trovare valori distinti per ogni x cioè:
x items
1 1, 2, 3, 4
2 1
o potresti voler controllare se ne contiene 3
oppure potresti volerli convertire in righe separate:
x items
1 1
1 2
1 3
1 1
1 4
2 1
Sarà un GRANDE DOLORE.
Usa almeno il 1° principio di normalizzazione:avere una riga separata per ogni valore.
Ora, supponiamo che all'inizio avevi questo come tavolo:
x item
1 1
1 2
1 3
1 1
1 4
2 1
Puoi convertirlo facilmente in valori CSV:
select x, group_concat(item order by item) items
from t
group by x
Se vuoi cercare se x =1 ha l'elemento 3. Facile.
select * from t where x = 1 and item = 3
che nel caso precedente avrebbe usato orribile find_in_set
:
select * from t where x = 1 and find_in_set(3, items);
Se pensi di poter utilizzare like con i valori CSV per la ricerca, prima like %x%
non è possibile utilizzare gli indici. In secondo luogo, produrrà risultati errati.
Supponiamo di voler controllare se l'elemento ab è presente e lo fai %ab%
restituirà righe con abc abcd abcde .... .
Se hai molti utenti ed elementi, ti suggerisco di creare una tabella separata users
con un ID utente PK, un altro items
con PK itemid e infine una tabella di mappatura user_item
con colonne userid, itemid.
Se sai che dovrai solo archiviare e recuperare questi valori e non eseguire alcuna operazione su di essi come unire, cercare, distinguere, convertire in righe separate ecc. ecc. 't).