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

SQL flet dublerede rækker og joinværdier, der er forskellige

Dårlig praksis at bruge kommaseparerede lister. Du kan læse dokumentation om databasenormalisering.

Kommaseparerede lister har mange praktiske problemer :

  • Kan ikke sikre, at hver værdi er den rigtige datatype:ingen måde at forhindre 1,2,3,banan,5
  • Kan ikke bruge fremmednøglebegrænsninger til at linke værdier til en opslagstabel; ingen måde at håndhæve referenceintegritet på.
  • Kan ikke håndhæve unikhed:ingen måde at forhindre 1,2,3,3,3,5
  • Kan ikke slette en værdi fra listen uden at hente hele listen.
  • Kan ikke gemme en liste længere end hvad der passer i strengkolonnen.
  • Svært at søge efter alle enheder med en given værdi på listen; du skal bruge en ineffektiv tabel-scanning. Skal muligvis ty til regulære udtryk, for eksempel i MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Svært at tælle elementer på listen, eller lav andre samlede forespørgsler.
  • Svært at forbinde værdierne med den opslagstabel, de refererer til.
  • Svært at hente listen i sorteret rækkefølge.
  • At gemme heltal som strenge tager omkring dobbelt så meget plads, når man gemmer binære heltal. For ikke at nævne den plads, som commacharacterne tager.

Men hvis du har brug for det under alle omstændigheder, kan du bruge sådan noget:

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

Mere om Kommaseparerede lister




  1. Node.js MYSQL for at detektere INSERT/UPDATE fuldstændigheden af ​​en forespørgsel?

  2. Er der en måde kun at installere mysql-klienten (Linux)?

  3. MySQL-koncepter:session vs forbindelse

  4. Hvilken er hurtigere:Korrelerede underforespørgsler eller join?