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

Jak przestawić schemat encji-atrybutu-wartości MySQL?

Pytanie wspomina MySQL i faktycznie ten DBMS ma specjalną funkcję dla tego rodzaju problemu:GROUP_CONCAT(expr) . Zajrzyj do dokumentacji MySQL instrukcja grupowania według funkcji . Funkcja została dodana w MySQL w wersji 4.1. Będziesz używać GROUP BY FileID w zapytaniu.

Nie jestem do końca pewien, jak chcesz, aby wyglądał wynik. Jeśli chcesz, aby każdy atrybut był wymieniony dla każdego przedmiotu (nawet jeśli nie jest ustawiony), będzie to trudniejsze. Oto moja sugestia, jak to zrobić:

SELECT bt.FileID, Title, Author, 
 GROUP_CONCAT(
  CONCAT_WS(':', at.AttributeName, at.AttributeType, avt.AttributeValue) 
  ORDER BY at.AttributeName SEPARATOR ', ') 
FROM BaseTable bt JOIN AttributeValueTable avt ON avt.FileID=bt.FileID 
 JOIN AttributeTable at ON avt.AttributeId=at.AttributeId 
GROUP BY bt.FileID;

Daje to wszystkie atrybuty w tej samej kolejności, co może być przydatne. Dane wyjściowe będą wyglądały następująco:

'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'

W ten sposób potrzebujesz tylko jednego zapytania do bazy danych, a dane wyjściowe są łatwe do przeanalizowania. Jeśli chcesz przechowywać atrybuty jako rzeczywistą datę i czas itp. w bazie danych, musisz użyć dynamicznego SQL, ale trzymam się tego wyraźnie i przechowuję wartości w varchars.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najbardziej wydajny sposób na uzyskanie liczby wierszy w tabeli

  2. Łączenie się ze zdalnym serwerem MySQL za pomocą PHP

  3. BŁĄD:Błąd 1005:Nie można utworzyć tabeli (errno:121)

  4. Procedura składowana, która automatycznie usuwa wiersze starsze niż 7 dni w MYSQL

  5. Recenzja produktu — gwiezdna naprawa bazy danych MySQL