Mysql
 sql >> Baza danych >  >> RDS >> Mysql

SQL scalanie zduplikowanych wierszy i łączenie wartości, które są różne

Zła praktyka używania list rozdzielanych przecinkami. Możesz przeczytać dokumentację o normalizacji bazy danych.

Listy oddzielone przecinkami mają wiele praktycznych problemów :

  • Nie mogę zapewnić, że każda wartość jest właściwym typem danych:nie ma sposobu, aby zapobiec 1,2,3,bananowi,5
  • Nie można używać ograniczeń klucza obcego do łączenia wartości z tabelą przeglądową; nie ma sposobu na wymuszenie integralności referencyjnej.
  • Nie można wymusić unikalności:nie ma sposobu, aby zapobiec 1,2,3,3,3,5
  • Nie można usunąć wartości z listy bez pobrania całej listy.
  • Nie można przechowywać listy dłuższej niż ta, która mieści się w kolumnie ciągu.
  • Trudno wyszukać wszystkie podmioty o podanej wartości na liście; musisz użyć nieefektywnego skanowania tabeli. Może być konieczne uciekanie się do wyrażeń regularnych, na przykład w MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Trudno policzyć elementy na liście lub wykonać inne zapytania zbiorcze.
  • Trudno połączyć wartości z tabelą przeglądową, do której się odnoszą.
  • Trudno pobrać listę w kolejności posortowanej.
  • Przechowywanie liczb całkowitych jako łańcuchów zajmuje około dwa razy więcej miejsca niż przechowywanie binarnych liczb całkowitych. Nie wspominając o miejscu zajmowanym przez przecinki.

Ale jeśli potrzebujesz tego w każdym przypadku, możesz użyć czegoś takiego:

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

Więcej informacji o Listy oddzielone przecinkami




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel - Nieprawidłowy numer parametru:parametr nie został zdefiniowany

  2. Przechowywanie wiodących zer liczb całkowitych w bazie danych MySQL jako INTEGER

  3. usuń * z tabeli nie działa

  4. Pusta lista parametrów klauzuli IN w MySQL

  5. Laravel Uzyskaj identyfikator rekordu z zapytania aktualizacji