2013-07-05 83 views
-2

我有4個表。如何構建以下sql查詢

1.Category Table. 
    Fields : Id , Name , Description 
    Data : 1 School This is school 


2.CategoryMeta Table 
    Field : Id , CategoryId , FieldName 
    Data : 1  1  Phone 
      2  1  Address 

3.Object Table 
    Field : Id , CategoryId , ojectName , ObjectDesc 
      1  1  ABC School This is a good school 

4.ObjectMeta Table 
    Fields : Id , CategoryId , ObjectId , CategoryMetaId , FieldValue 
    Data : 1  1   1    1   919475864253 
      2  1   1    2   ABC Road.India 

我想從query.I以下輸出設置類別ID作爲參數

ObjectId ObjectName ObjectDesc    Phone  Address 
    1  ABC School This is a good school 919475864253 ABC Road.India 

我需要objects.Can的列表中的任何一個幫助我..提前 感謝。

+1

你是否試圖自己寫這個查詢?你能解釋一下你是如何將表格聯繫到最終結果集的? –

+0

在http://sqlfiddle.com/中進行設置,發佈鏈接可以幫助您解答問題。通過這個查詢工作的 –

+1

將讓你明白爲什麼你不這樣做這樣的模式 - 這是OOP語言更好的結構。 – Randy

回答

1

你應該能夠連接表,並使用聚合函數與CASE表達式的值的行轉換爲列:

select o.id, 
    o.ojectname, 
    o.objectdesc, 
    max(case when cm.fieldname = 'Phone' then om.fieldvalue end) Phone, 
    max(case when cm.fieldname = 'Address' then om.fieldvalue end) Address 
from object o 
left join objectmeta om 
    on o.id = om.objectid 
left join categorymeta cm 
    on om.categorymetaid = cm.id 
group by o.id, o.ojectname, o.objectdesc; 

SQL Fiddle with Demo。根據你正在使用的RDBMS,你可以創建一個動態的SQL版本,它會根據你的數據庫中存儲的內容得到fieldnames的列表。

+0

謝謝..它的工作..謝謝了很多的幫助。但在我的情況下電話,地址那些也不是靜態。這些都取決於categoryMeta表的值。非常感謝您的幫助。我接受您的回答。 –

+0

@amitghosh您正在使用什麼數據庫?我可以提供動態版本,但代碼基於數據庫。 – Taryn

+0

我正在使用mysql..But我需要在codeigniter中編寫這個查詢。 –

0

這是查詢,但您的模式需要一些改進。

select ph.*, om2.FieldValue as Address from 
(
    select o.id as ObjectId, o.ObjectName, o.ObjectDesc,om1.FieldValue as Phone 
    from object o 
    join ObjectMeta om1 on o.id = om1.ObjectID 
    where om1.CategoryMetaID = 1 
) ph 
join ObjectMeta om2 on ph.ObjectId = om2.ObjectID 
where om2.CategoryMetaID = 2 
+0

是om1和om2都是ObjectMeta? –

+0

地址和電話也不是靜態的......它可以是任何類別的任何東西。 –

+0

對不起,它不工作..它給0行作爲結果。 –