Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como dinamizar um esquema de valor de atributo de entidade MySQL


A questão menciona o MySQL, e na verdade este SGBD tem uma função especial para este tipo de problema:GROUP_CONCAT(expr) . Dê uma olhada na referência do MySQL manual sobre agrupar por funções . A função foi adicionada no MySQL versão 4.1. Você usará GROUP BY FileID na consulta.

Não tenho muita certeza sobre como você quer que o resultado fique. Se você quiser todos os atributos listados para cada item (mesmo se não estiver definido), será mais difícil. No entanto, esta é a minha sugestão de como fazê-lo:
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;

Isso fornece todos os atributos na mesma ordem, o que pode ser útil. A saída será como a seguinte:
'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'

Dessa forma, você só precisa de uma única consulta de banco de dados e a saída é fácil de analisar. Se você quiser armazenar os atributos como Datetime real etc. no banco de dados, você precisaria usar SQL dinâmico, mas eu ficaria claro disso e armazenaria os valores em varchars.