2009-03-16 13 views
23

मुझे उन टेबलों को डिज़ाइन करने की आवश्यकता है जो फ़ाइलों के सभी मेटाडेटा (यानी, फ़ाइल का नाम, लेखक, शीर्षक, दिनांक बनाया गया), और कस्टम मेटाडेटा (जिन्हें फ़ाइलों में जोड़ा गया है) उपयोगकर्ताओं द्वारा, उदाहरण के लिए CustUseBy, CustSendBy)। कस्टम मेटाडेटा फ़ील्ड की संख्या पहले से सेट नहीं की जा सकती है। दरअसल, फाइलों पर क्या और कितने कस्टम टैग जोड़े गए हैं यह निर्धारित करने का एकमात्र तरीका यह है कि टेबल में मौजूद क्या है।एक MySQL इकाई-विशेषता-मूल्य स्कीमा को कैसे पिवोट करें

इस स्टोर करने के लिए, मैं एक आधार तालिका (फ़ाइलों के सभी आम मेटाडाटा होने), एक Attributes मेज और एक FileAttributes तालिका (अतिरिक्त, वैकल्पिक विशेषताओं फाइलों पर सेट किया जा सकता है कि पकड़े) (जो एक के लिए एक मूल्य प्रदान करती है बनाया है एक फ़ाइल के लिए विशेषता)।

CREAT TABLE FileBase (
    id VARCHAR(32) PRIMARY KEY, 
    name VARCHAR(255) UNIQUE NOT NULL, 
    title VARCHAR(255), 
    author VARCHAR(255), 
    created DATETIME NOT NULL, 
) Engine=InnoDB; 

CREATE TABLE Attributes (
    id VARCHAR(32) PRIMARY KEY, 
    name VARCHAR(255) NOT NULL, 
    type VARCHAR(255) NOT NULL 
) Engine=InnoDB; 

CREATE TABLE FileAttributes (
    sNo INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    fileId VARCHAR(32) NOT NULL, 
    attributeId VARCHAR(32) NOT NULL, 
    attributeValue VARCHAR(255) NOT NULL, 
    FOREIGN KEY fileId REFERENCES FileBase (id), 
    FOREIGN KEY attributeId REFERENCES Attributes (id) 
) Engine=InnoDB; 

नमूना डेटा:

FileId, Title, Author, CustomAttri1, CustomAttr2, ... 
F001 Dox vinay Akash   2009/03/02 ... 
F002 Excel Ajay  

क्या क्वेरी इस परिणाम उत्पन्न करेगा:

INSERT INTO FileBase 
(id,  title, author, name,  created) 
    VALUES 
('F001', 'Dox', 'vinay', 'story.dox', '2009/01/02 15:04:05'), 
('F002', 'Excel', 'Ajay', 'data.xls', '2009/02/03 01:02:03'); 

INSERT INTO Attributes 
(id,  name,   type) 
    VALUES 
('A001', 'CustomeAttt1', 'Varchar(40)'), 
('A002', 'CustomUseDate', 'Datetime'); 

INSERT INTO FileAttributes 
(fileId, attributeId, attributeValue) 
    VALUES 
('F001', 'A001',  'Akash'), 
('F001', 'A002',  '2009/03/02'); 

अब समस्या मैं इस तरह के एक तरीके से डेटा दिखाने के लिए चाहते हैं?

+0

क्या प्रोग्रामिंग भाषा का उपयोग करने वाले हैं? –

+0

MYSQL, मैं MYSQL क्वेरी द्वारा वांछित परिणाम प्राप्त करने की योजना बना रहा हूं और फिर इस परिणाम को अन्य तालिकाओं में शामिल कर सकता हूं और वांछित परिणाम को FrontEnd पास कर सकता हूं। –

+0

MySQL प्रोग्रामिंग भाषा नहीं है ... –

उत्तर

-1

आंशिक उत्तर क्योंकि मुझे MySQL (अच्छी तरह से) नहीं पता है। एमएसएसक्यूएल में मैं पिवोट टेबल देखता हूं या संग्रहीत प्रक्रिया में एक अस्थायी तालिका बनाउंगा। यह एक कठिन समय हो सकता है ...

+0

हाय धन्यवाद .. लेकिन मैं पीएल में इतना गड़बड़ नहीं हूं, मैंने टी-एसक्यूएल में विस्तार किया है, क्या आप मुझे ब्रेफ में व्याख्या कर सकते हैं कि उदाहरण के साथ इसे कैसे प्राप्त किया जाए। बहुत धन्यवाद। –

5

यह एसक्यूएल में मानक "कॉलम पंक्तियों" समस्या है।

यह एसक्यूएल के बाहर आसानी से किया जाता है।

अपने आवेदन में, निम्न कार्य करें:

  1. एक साधारण वर्ग को परिभाषित करें फ़ाइल को रोकने के लिए, सिस्टम गुण, और उपयोगकर्ता की एक संग्रह जिम्मेदार बताते हैं। ग्राहक विशेषताओं के इस संग्रह के लिए एक सूची एक अच्छी पसंद है। आइए इस क्लास फ़ाइल डिस्क्रिप्शन को कॉल करें।

  2. फ़ाइल के बीच फ़ाइल और सभी ग्राहक विशेषताओं के बीच एक सरल जुड़ाव निष्पादित करें।

  3. क्वेरी परिणाम से फ़ाइल डिस्क्रिप्शन को इकट्ठा करने के लिए एक लूप लिखें।

    • पहली पंक्ति प्राप्त करें, फ़ाइल डिस्क्रिप्शन बनाएं और पहले ग्राहक विशेषता सेट करें।

      • एक पंक्ति
      • लायें लिए इस पंक्ति के फ़ाइल नाम FileDescription हम निर्माण कर रहे हैं मेल नहीं खाती है:

      • जबकि वहाँ लाने के लिए और अधिक पंक्तियाँ हैं खत्म एक FileDescription निर्माण; परिणामस्वरूप फ़ाइल विवरण संग्रह का संग्रह करें; दिए गए नाम और पहले ग्राहक विशेषता के साथ एक ताजा, खाली फ़ाइल डिस्क्रिप्शन बनाएं।

      • लिए इस पंक्ति के फ़ाइल नाम FileDescription हम निर्माण कर रहे हैं से मेल खाता है: वर्तमान FileDescription
+0

हाय धन्यवाद .. लेकिन मैं पीएल में नहीं हूं, मैं टी-एसक्यूएल में विस्तारित हूं, क्या आप मुझे ब्रेफ में व्याख्या कर सकते हैं कि उदाहरण के साथ इसे कैसे प्राप्त किया जाए। बहुत बहुत धन्यवाद। - –

7

इस तरह के एक प्रश्न के सामान्य रूप होगा के लिए एक और ग्राहक विशेषता संलग्न

SELECT file.*, 
    attr1.value AS 'Attribute 1 Name', 
    attr2.value AS 'Attribute 2 Name', 
    ... 
FROM 
    file 
    LEFT JOIN attr AS attr1 
     ON(file.FileId=attr1.FileId and attr1.AttributeId=1) 
    LEFT JOIN attr AS attr2 
     ON(file.FileId=attr2.FileId and attr2.AttributeId=2) 
    ... 

तो आपको अपनी इच्छितताओं से गतिशील रूप से अपनी क्वेरी बनाने की आवश्यकता है। php-ish स्यूडोकोड में

$cols="file"; 
$joins=""; 

$rows=$db->GetAll("select * from Attributes"); 
foreach($rows as $idx=>$row) 
{ 
    $alias="attr{$idx}"; 
    $cols.=", {$alias}.value as '".mysql_escape_string($row['AttributeName'])."'"; 
    $joins.="LEFT JOIN attr as {$alias} on ". 
     "(file.FileId={$alias}.FileId and ". 
     "{$alias}.AttributeId={$row['AttributeId']}) "; 
} 

$pivotsql="select $cols from file $joins"; 
+0

परिणाम प्राप्त करने के लिए मैं एक प्रक्रिया बना सकता हूं और रिकॉर्ड के माध्यम से स्थानांतरित करने के लिए इसमें एक कर्सर लिख सकता हूं .. यदि संभव हो, उदाहरण के साथ मुझे समझाओ मैं मदद के लिए आभारी हूं। –

+0

हां, यदि आप $ pivotsql क्वेरी के माध्यम से निष्पादित करते हैं और फिर से सक्रिय करते हैं, तो प्रत्येक पंक्ति एक फ़ाइल होगी और प्रत्येक विशेषता के लिए एक कॉलम होगा, जो उस फ़ाइल के लिए विशेषता मौजूद नहीं है, जो पूर्ण होगा। –

+2

ऐसा लगता है कि पिछले कुछ हफ्तों के बाद मैं क्या कर रहा हूं। बहुत बहुत धन्यवाद –

0

लेकिन वहाँ समाधान स्तंभों के रूप में उपयोग करने के लिए लाइनों, उर्फ ​​डेटा स्थानांतरित कर रहे हैं। इसमें शुद्ध एसक्यूएल में ऐसा करने के लिए क्वेरी ट्रिक्स शामिल हैं, या आपको पिवोट टेबल (या क्रॉस टेबल) का उपयोग करके कुछ डेटाबेस में केवल कुछ विशेषताओं पर भरोसा करना होगा।

As exemple you can see how to do this here in Oracle (11g).

प्रोग्रामिंग संस्करण बनाए रखने के लिए और बनाने के लिए और इसके अलावा किसी भी डेटाबेस के साथ काम करेंगे सरल हो जाएगा।

+0

मुझे बताएं कि डिलीमीटर के साथ तालिका के कॉलम में विशेषता मानों को स्टोर करें, फिर हम विशेषता नाम को कहां स्टोर करते हैं .. यदि हम पृथक्करण के लिए एक डेलीमीटर के साथ विशेषता कॉलम और मान दोनों कॉलम में संग्रहीत करते हैं (मामले में जहां एक से अधिक attribbute एक फ़ाइल के लिए) तो मैं इन मानों को कैसे स्थानांतरित करूं –

+0

जैसा कि आप रनटाइम से पहले कस्टम विशेषताओं की संख्या नहीं जानते हैं, मैं प्रोग्रामेटिकल तरीके से जाऊंगा। या तो अपने प्रोग्राम के साथ एक क्वेरी गतिशीलता का निर्माण, या शामिल होने के साथ सभी डेटा निकालें और lopp इसे खरीदा। एक जटिल क्वेरी बनाने से रखरखाव और tweaking जटिल हो जाएगा। – MarmouCorp

20

प्रश्न MySQL का उल्लेख करता है, और वास्तव में इस डीबीएमएस के इस प्रकार की समस्या के लिए एक विशेष कार्य है: GROUP_CONCAT(expr)MySQL reference manual on group-by-functions में एक नज़र डालें। समारोह MySQL संस्करण 4.1 में जोड़ा गया था। आप क्वेरी में GROUP BY FileID का उपयोग करेंगे।

मुझे वास्तव में यह सुनिश्चित नहीं है कि आप परिणाम कैसे देखना चाहते हैं। यदि आप प्रत्येक आइटम के लिए सूचीबद्ध प्रत्येक विशेषता (यहां तक ​​कि सेट नहीं होने पर भी) चाहते हैं, तो यह कठिन होगा। हालांकि, यह मेरा सुझाव है कि इसे कैसे करें:

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; 

यह आपको एक ही क्रम में सभी विशेषताओं देता है, जो उपयोगी हो सकता है। उत्पादन निम्नलिखित तरह होगा:

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

इस तरह आप केवल एक ही डीबी क्वेरी की जरूरत है, और उत्पादन को पार्स करने के लिए आसान है। यदि आप डीबी में वास्तविक डेटाटाइम आदि के रूप में विशेषताओं को स्टोर करना चाहते हैं, तो आपको गतिशील एसक्यूएल का उपयोग करना होगा, लेकिन मैं इससे स्पष्ट रहूंगा और मूल्यों को वर्चर्स में संग्रहीत करूंगा।

8

यदि आप किसी समूह-अनुरूप परिणाम से अधिक उपयोग करने योग्य (और शामिल करने योग्य) की तलाश में हैं, तो नीचे दिए गए इस समाधान को आजमाएं। मैंने इसे समझने के लिए आपके उदाहरण के समान कुछ तालिकाओं को बनाया है।

यह काम करता है जब:

  • आप एक शुद्ध एसक्यूएल समाधान (कोई कोड, कोई छोरों)
  • चाहते हैं तो आप विशेषताओं में से एक उम्मीद के मुताबिक सेट है (उदाहरण के लिएनहीं गतिशील)
  • आप क्वेरी को अद्यतन करने के लिए ठीक हैं जब नए विशेषता प्रकार
  • आप एक परिणाम है कि करने के लिए, UNIONed शामिल हुए किया जा सकता है, या नेस्टेड एक subselect

तालिका A के रूप में पसंद करेंगे जोड़ा जाना चाहिए (फ़ाइलें)

FileID, Title, Author, CreatedOn 

टेबल बी (गुण)

AttrID, AttrName, AttrType [not sure how you use type...] 

टेबल सी (Files_Attributes)

FileID, AttrID, AttrValue 

एक परंपरागत क्वेरी खींच होगा कई अनावश्यक पंक्तियाँ:

SELECT * FROM 
Files F 
LEFT JOIN Files_Attributes FA USING (FileID) 
LEFT JOIN Attributes A USING (AttributeID); 
 
AttrID FileID Title   Author CreatedOn AttrValue AttrName AttrType 
50  1  TestFile  Joe  2011-01-01 true  ReadOnly  bool 
60  1  TestFile  Joe  2011-01-01 xls   FileFormat  text 
70  1  TestFile  Joe  2011-01-01 false  Private   bool 
80  1  TestFile  Joe  2011-01-01 2011-10-03 LastModified date 
60  2  LongNovel  Mary 2011-02-01 json  FileFormat  text 
80  2  LongNovel  Mary 2011-02-01 2011-10-04 LastModified date 
70  2  LongNovel  Mary 2011-02-01 true  Private   bool 
50  2  LongNovel  Mary 2011-02-01 true  ReadOnly  bool 
50  3  ShortStory  Susan 2011-03-01 false  ReadOnly  bool 
60  3  ShortStory  Susan 2011-03-01 ascii  FileFormat  text 
70  3  ShortStory  Susan 2011-03-01 false  Private   bool 
80  3  ShortStory  Susan 2011-03-01 2011-10-01 LastModified date 
50  4  ProfitLoss  Bill 2011-04-01 false  ReadOnly  bool 
70  4  ProfitLoss  Bill 2011-04-01 true  Private   bool 
80  4  ProfitLoss  Bill 2011-04-01 2011-10-02 LastModified date 
60  4  ProfitLoss  Bill 2011-04-01 text  FileFormat  text 
50  5  MonthlyBudget George 2011-05-01 false  ReadOnly  bool 
60  5  MonthlyBudget George 2011-05-01 binary  FileFormat  text 
70  5  MonthlyBudget George 2011-05-01 false  Private   bool 
80  5  MonthlyBudget George 2011-05-01 2011-10-20 LastModified date 

यह कोलेसिंग क्वेरी (दृष्टिकोण मैक्स का प्रयोग करके) पंक्तियों को मिला कर सकते हैं:

SELECT 
F.*, 
MAX(IF(A.AttrName = 'ReadOnly', FA.AttrValue, NULL)) as 'ReadOnly', 
MAX(IF(A.AttrName = 'FileFormat', FA.AttrValue, NULL)) as 'FileFormat', 
MAX(IF(A.AttrName = 'Private', FA.AttrValue, NULL)) as 'Private', 
MAX(IF(A.AttrName = 'LastModified', FA.AttrValue, NULL)) as 'LastModified' 
FROM 
Files F 
LEFT JOIN Files_Attributes FA USING (FileID) 
LEFT JOIN Attributes A USING (AttributeID) 
GROUP BY 
F.FileID; 
 
FileID Title   Author CreatedOn ReadOnly FileFormat Private LastModified 
1  TestFile  Joe  2011-01-01 true  xls   false 2011-10-03 
2  LongNovel  Mary 2011-02-01 true  json  true 2011-10-04 
3  ShortStory  Susan 2011-03-01 false  ascii  false 2011-10-01 
4  ProfitLoss  Bill 2011-04-01 false  text  true 2011-10-02 
5  MonthlyBudget George 2011-05-01 false  binary  false 2011-10-20 
2

मैं विभिन्न उत्तरों के साथ प्रयोग कर रहा हूं और मेथाई का जवाब मेरे लिए सबसे सुविधाजनक था। मेरा वर्तमान प्रोजेक्ट, हालांकि यह MySQL के साथ सिद्धांत का उपयोग करता है, इसमें कुछ ढीले टेबल हैं।

निम्नलिखित Methai के समाधान के साथ मेरा अनुभव का परिणाम है:

बनाने इकाई तालिका

DROP TABLE IF EXISTS entity; 
CREATE TABLE entity (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    title VARCHAR(255), 
    author VARCHAR(255), 
    createdOn DATETIME NOT NULL 
) Engine = InnoDB; 

बनाने विशेषता तालिका

DROP TABLE IF EXISTS attribute; 
CREATE TABLE attribute (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(255) NOT NULL, 
    type VARCHAR(255) NOT NULL 
) Engine = InnoDB; 

attributevalue तालिका बनाने

DROP TABLE IF EXISTS attributevalue; 
CREATE TABLE attributevalue (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    value VARCHAR(255) NOT NULL, 
    attribute_id INT UNSIGNED NOT NULL, 
    FOREIGN KEY(attribute_id) REFERENCES attribute(id) 
) Engine = InnoDB; 

entity_attributevalue तालिका

DROP TABLE IF EXISTS entity_attributevalue; 
CREATE TABLE entity_attributevalue (
    entity_id INT UNSIGNED NOT NULL, 
    attributevalue_id INT UNSIGNED NOT NULL, 
    FOREIGN KEY(entity_id) REFERENCES entity(id), 
    FOREIGN KEY(attributevalue_id) REFERENCES attributevalue(id) 
) Engine = InnoDB; 

रूप से भरें इकाई तालिका

INSERT INTO entity 
    (title, author, createdOn) 
VALUES 
    ('TestFile', 'Joe', '2011-01-01'), 
    ('LongNovel', 'Mary', '2011-02-01'), 
    ('ShortStory', 'Susan', '2011-03-01'), 
    ('ProfitLoss', 'Bill', '2011-04-01'), 
    ('MonthlyBudget', 'George', '2011-05-01'), 
    ('Paper', 'Jane', '2012-04-01'), 
    ('Essay', 'John', '2012-03-01'), 
    ('Article', 'Dan', '2012-12-01'); 

रूप से भरें विशेषता तालिका

में शामिल होने का सृजन
INSERT INTO attribute 
    (name, type) 
VALUES 
    ('ReadOnly', 'bool'), 
    ('FileFormat', 'text'), 
    ('Private', 'bool'), 
    ('LastModified', 'date'); 

रूप से भरें attributevalue तालिका

INSERT INTO attributevalue 
    (value, attribute_id) 
VALUES 
    ('true', '1'), 
    ('xls', '2'), 
    ('false', '3'), 
    ('2011-10-03', '4'), 
    ('true', '1'), 
    ('json', '2'), 
    ('true', '3'), 
    ('2011-10-04', '4'), 
    ('false', '1'), 
    ('ascii', '2'), 
    ('false', '3'), 
    ('2011-10-01', '4'), 
    ('false', '1'), 
    ('text', '2'), 
    ('true', '3'), 
    ('2011-10-02', '4'), 
    ('false', '1'), 
    ('binary', '2'), 
    ('false', '3'), 
    ('2011-10-20', '4'), 
    ('doc', '2'), 
    ('false', '3'), 
    ('2011-10-20', '4'), 
    ('rtf', '2'), 
    ('2011-10-20', '4'); 

रूप से भरें entity_attributevalue तालिका

INSERT INTO entity_attributevalue 
    (entity_id, attributevalue_id) 
VALUES 
    ('1', '1'), 
    ('1', '2'), 
    ('1', '3'), 
    ('1', '4'), 
    ('2', '5'), 
    ('2', '6'), 
    ('2', '7'), 
    ('2', '8'), 
    ('3', '9'), 
    ('3', '10'), 
    ('3', '11'), 
    ('3', '12'), 
    ('4', '13'), 
    ('4', '14'), 
    ('4', '15'), 
    ('4', '16'), 
    ('5', '17'), 
    ('5', '18'), 
    ('5', '19'), 
    ('5', '20'), 
    ('6', '21'), 
    ('6', '22'), 
    ('6', '23'), 
    ('7', '24'), 
    ('7', '25'); 

दिखा सभी रिकॉर्ड

SELECT * 
FROM `entity` e 
LEFT JOIN `entity_attributevalue` ea ON ea.entity_id = e.id 
LEFT JOIN `attributevalue` av ON ea.attributevalue_id = av.id 
LEFT JOIN `attribute` a ON av.attribute_id = a.id; 
 
id title   author createdOn   entity_id attributevalue_id id  value  attribute_id id  name   type 
1 TestFile  Joe  2011-01-01 00:00:00 1   1     1  true  1    1  ReadOnly  bool 
1 TestFile  Joe  2011-01-01 00:00:00 1   2     2  xls   2    2  FileFormat  text 
1 TestFile  Joe  2011-01-01 00:00:00 1   3     3  false  3    3  Private   bool 
1 TestFile  Joe  2011-01-01 00:00:00 1   4     4  2011-10-03 4    4  LastModified date 
2 LongNovel  Mary 2011-02-01 00:00:00 2   5     5  true  1    1  ReadOnly  bool 
2 LongNovel  Mary 2011-02-01 00:00:00 2   6     6  json  2    2  FileFormat  text 
2 LongNovel  Mary 2011-02-01 00:00:00 2   7     7  true  3    3  Private   bool 
2 LongNovel  Mary 2011-02-01 00:00:00 2   8     8  2011-10-04 4    4  LastModified date 
3 ShortStory  Susan 2011-03-01 00:00:00 3   9     9  false  1    1  ReadOnly  bool 
3 ShortStory  Susan 2011-03-01 00:00:00 3   10     10  ascii  2    2  FileFormat  text 
3 ShortStory  Susan 2011-03-01 00:00:00 3   11     11  false  3    3  Private   bool 
3 ShortStory  Susan 2011-03-01 00:00:00 3   12     12  2011-10-01 4    4  LastModified date 
4 ProfitLoss  Bill 2011-04-01 00:00:00 4   13     13  false  1    1  ReadOnly  bool 
4 ProfitLoss  Bill 2011-04-01 00:00:00 4   14     14  text  2    2  FileFormat  text 
4 ProfitLoss  Bill 2011-04-01 00:00:00 4   15     15  true  3    3  Private   bool 
4 ProfitLoss  Bill 2011-04-01 00:00:00 4   16     16  2011-10-02 4    4  LastModified date 
5 MonthlyBudget George 2011-05-01 00:00:00 5   17     17  false  1    1  ReadOnly  bool 
5 MonthlyBudget George 2011-05-01 00:00:00 5   18     18  binary  2    2  FileFormat  text 
5 MonthlyBudget George 2011-05-01 00:00:00 5   19     19  false  3    3  Private   bool 
5 MonthlyBudget George 2011-05-01 00:00:00 5   20     20  2011-10-20 4    4  LastModified date 
6 Paper   Jane 2012-04-01 00:00:00 6   21     21  binary  2    2  FileFormat  text 
6 Paper   Jane 2012-04-01 00:00:00 6   22     22  false  3    3  Private   bool 
6 Paper   Jane 2012-04-01 00:00:00 6   23     23  2011-10-20 4    4  LastModified date 
7 Essay   John 2012-03-01 00:00:00 7   24     24  binary  2    2  FileFormat  text 
7 Essay   John 2012-03-01 00:00:00 7   25     25  2011-10-20 4    4  LastModified date 
8 Article   Dan  2012-12-01 00:00:00 NULL  NULL    NULL NULL  NULL   NULL NULL   NULL 

पाइवट टेबल

SELECT e.*, 
    MAX(IF(a.name = 'ReadOnly', av.value, NULL)) as 'ReadOnly', 
    MAX(IF(a.name = 'FileFormat', av.value, NULL)) as 'FileFormat', 
    MAX(IF(a.name = 'Private', av.value, NULL)) as 'Private', 
    MAX(IF(a.name = 'LastModified', av.value, NULL)) as 'LastModified' 
FROM `entity` e 
LEFT JOIN `entity_attributevalue` ea ON ea.entity_id = e.id 
LEFT JOIN `attributevalue` av ON ea.attributevalue_id = av.id 
LEFT JOIN `attribute` a ON av.attribute_id = a.id 
GROUP BY e.id; 
 
id title   author createdOn   ReadOnly FileFormat Private LastModified 
1 TestFile  Joe  2011-01-01 00:00:00 true  xls   false 2011-10-03 
2 LongNovel  Mary 2011-02-01 00:00:00 true  json  true 2011-10-04 
3 ShortStory  Susan 2011-03-01 00:00:00 false  ascii  false 2011-10-01 
4 ProfitLoss  Bill 2011-04-01 00:00:00 false  text  true 2011-10-02 
5 MonthlyBudget George 2011-05-01 00:00:00 false  binary  false 2011-10-20 
6 Paper   Jane 2012-04-01 00:00:00 NULL  binary  false 2011-10-20 
7 Essay   John 2012-03-01 00:00:00 NULL  binary  NULL 2011-10-20 
8 Article   Dan  2012-12-01 00:00:00 NULL  NULL  NULL NULL 
संबंधित मुद्दे