Mysql
 sql >> Database >  >> RDS >> Mysql

SQL unisce righe duplicate e unisce valori diversi

Cattiva pratica di utilizzare elenchi separati da virgole. Puoi leggere la documentazione sulla normalizzazione del database.

Gli elenchi separati da virgole hanno molti problemi pratici :

  • Non posso garantire che ogni valore sia il tipo di dati corretto:nessun modo per prevenire 1,2,3,banana,5
  • Impossibile utilizzare i vincoli di chiave esterna per collegare i valori a una tabella di ricerca; nessun modo per imporre l'integrità referenziale.
  • Impossibile imporre l'unicità:nessun modo per impedire 1,2,3,3,3,5
  • Impossibile eliminare un valore dall'elenco senza recuperare l'intero elenco.
  • Impossibile memorizzare un elenco più lungo di quello che rientra nella colonna della stringa.
  • Difficile cercare tutte le entità con un determinato valore nell'elenco; devi usare una scansione tabellare inefficiente. Potrebbe essere necessario ricorrere a espressioni regolari, ad esempio in MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Difficile contare gli elementi nell'elenco o eseguire altre query aggregate.
  • Difficile unire i valori alla tabella di ricerca a cui fanno riferimento.
  • Difficile recuperare l'elenco in ordine.
  • La memorizzazione di interi come stringhe richiede circa il doppio dello spazio rispetto agli interi binari. Per non parlare dello spazio occupato dalla virgola.

Ma se ne hai bisogno in ogni caso, potresti usare qualcosa del genere:

SELECT  FilmID,
        FilmName, 
        Id = REPLACE(
                (
                SELECT DateShown AS [data()]
                FROM YourTable
                WHERE FilmID = a.FilmID
                ORDER BY FilmName FOR XML PATH('')), ' ', ','
                )
FROM    YourTable a
WHERE   FilmName IS NOT NULL
GROUP BY FilmID, FilmName

Ulteriori informazioni su Elenchi separati da virgole