Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL обединява дублиращи се редове и обединява стойности, които са различни

Лоша практика за използване на списъци, разделени със запетая. Можете да прочетете документация относно нормализирането на базата данни.

Списъците, разделени със запетая, имат много практически проблеми :

  • Не мога да гарантирам, че всяка стойност е правилният тип данни:няма начин да се предотврати 1,2,3,banana,5
  • Не може да се използват ограничения на външния ключ за свързване на стойности към справочна таблица; няма начин за налагане на референтна цялост.
  • Не може да се наложи уникалност:няма начин да се предотврати 1,2,3,3,3,5
  • Не може да се изтрие стойност от списъка, без да се извлече целия списък.
  • Не може да се съхранява списък, по-дълъг от този, който се побира в колоната низ.
  • Трудно е да се търсят всички обекти с дадена стойност в списъка; трябва да използвате неефективно сканиране на таблица. Може да се наложи да се прибегне до регулярни изрази, например в MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Трудно е да се преброят елементи в списъка или да се правят други обобщени заявки.
  • Трудно е да се присъединят стойностите към справочната таблица, която препращат.
  • Трудно е да се извлече списъкът в сортиран ред.
  • Съхраняването на цели числа като низове отнема около два пъти повече място в сравнение с двоични цели числа. Да не говорим за пространството, заето от знаците comma.

Но ако имате нужда от него за всеки случай, можете да използвате нещо подобно:

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

Повече за Списъци, разделени със запетая




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изберете mysql заявка между дата?

  2. Как мога да сортирам по множество колони, но не и по стойност?

  3. Плъзгаща се средна - MySQL

  4. Използването на IN с подзаявка не използва индекс

  5. Кеширане на подготвени изявления за PDO