sql >> Databasteknik >  >> RDS >> Mysql

SQL slå samman dubbletter av rader och sammanfoga värden som är olika

Dålig praxis att använda kommaseparerade listor. Du kan läsa dokumentation om databasnormalisering.

Kommaseparerade listor har många praktiska problem :

  • Kan inte säkerställa att varje värde är rätt datatyp:inget sätt att förhindra 1,2,3,banan,5
  • Kan inte använda begränsningar för främmande nyckel för att länka värden till en uppslagstabell; inget sätt att framtvinga referensintegritet.
  • Kan inte framtvinga unikhet:inget sätt att förhindra 1,2,3,3,3,5
  • Det går inte att ta bort ett värde från listan utan att hämta hela listan.
  • Kan inte lagra en lista längre än vad som får plats i strängkolumnen.
  • Svårt att söka efter alla enheter med ett givet värde i listan; du måste använda en ineffektiv tabellskanning. Kan behöva tillgripa reguljära uttryck, till exempel i MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Svårt att räkna element i listan, eller göra andra sammanställda frågor.
  • Svårt att koppla samman värdena till uppslagstabellen de refererar till.
  • Svårt att hämta listan i sorterad ordning.
  • Att lagra heltal som strängar tar ungefär dubbelt så mycket utrymme för att lagra binära heltal. För att inte tala om utrymmet som commacharaktörerna tar.

Men om du behöver det i vilket fall som helst, kan du använda något liknande:

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

Mer om Kommaseparerade listor




  1. AWS Python Lambda med Oracle

  2. 1045, Åtkomst nekad för användaren 'användarnamn'@'NOT-local' (med lösenord:JA)

  3. Hur hämtar man resultat från MySQL-rad med flera kolumner med samma namn med PHP?

  4. Kan inte skapa MySQL TRIGGER när jag använder IS NOT NULL