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.