Câu hỏi đề cập đến MySQL và trên thực tế DBMS này có một chức năng đặc biệt cho loại vấn đề này:GROUP_CONCAT(expr)
. Hãy xem tham khảo MySQL hướng dẫn sử dụng từng nhóm chức năng
. Chức năng đã được thêm vào MySQL phiên bản 4.1. Bạn sẽ sử dụng GROUP BY FileID
trong truy vấn.
Tôi không thực sự chắc chắn về cách bạn muốn kết quả trông như thế nào. Nếu bạn muốn mọi thuộc tính được liệt kê cho mọi mục (ngay cả khi không được đặt), thì sẽ khó hơn. Tuy nhiên, đây là gợi ý của tôi về cách thực hiện:
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;
Điều này cung cấp cho bạn tất cả các thuộc tính theo cùng một thứ tự, điều này có thể hữu ích. Đầu ra sẽ như sau:
'F001', 'Dox', 'vinay', 'CustomAttr1:varchar(40):Akash, CustomUseDate:Datetime:2009/03/02'
Bằng cách này, bạn chỉ cần một truy vấn DB duy nhất và kết quả đầu ra rất dễ dàng để phân tích cú pháp. Nếu bạn muốn lưu trữ các thuộc tính dưới dạng Datetime thực, v.v. trong DB, bạn cần sử dụng SQL động, nhưng tôi muốn làm rõ điều đó và lưu trữ các giá trị trong varchars.