2017-05-09 20 views
0

我有兩個MySQL表record_itemsproperty_values具有以下結構。MySQL表順序時另一列具有特定值

table : property_values (column REC is foreign key to record_items) 

id(PK)|REC(FK)| property | value| 
1 | 1  | name  | A | 
2 | 1  | age  | 10 | 
3 | 2  | name  | B | 
4 | 3  | name  | C | 
5 | 3  | age  | 9 | 

table: record_items 

id(PK) |col1|col2 |col3| 
1  | v11| v12 | v13| 
2  | v21| v22 | v23| 
3  | v31| v32 | v33| 
4  | v41| v42 | v43| 
5  | v51| v52 | v53| 

record_items表包含有關記錄,其中作爲property_values表保存record_item作爲外鍵,並且每個屬性和它的值保存在一個單獨的行僅基本信息。

現在我想獲得record_items根據特定的屬性,按年齡分類。 我的HQL查詢會像

Select distinct rec from PropertyValues where property="age" order by value; 

但這種查詢將被跳過的記錄2,因爲它不具備產權年限的條目。 我期望結果具有按照排序順序包含年齡屬性的記錄,並附加那些根本沒有年齡屬性的記錄。我如何查詢?

+0

我們如何在'record_items'表中關聯年齡?你的數據看起來並不正常。 –

+0

我剛剛舉了一個例子。 Record_items可以擁有大量的屬性,大約在1000左右,並且這是動態的,因爲所有記錄都不具有所有列的值。因此,我沒有在record_items表中保留1000列,而是在record_items表中保留了幾個基本列,並且一個單獨的表property_values存儲了記錄項的每個屬性和值。 (我給出的年齡欄作爲示例) – Jerry

+0

OK ...如果'record_items'中的給定記錄沒有映射到屬性,您想要什麼行爲?應該如何訂購? –

回答

1

這裏是原始MySQL查詢應該做的伎倆:

SELECT t1.* 
FROM record_items t1 
LEFT JOIN property_values t2 
    ON t1.id = t2.REC AND 
     t2.property = 'age' 
ORDER BY CASE WHEN t2.value IS NULL THEN 1 ELSE 0 END, t2.Value 

我注意到你在property_valuesValue列混合數字和文本數據。這對於分類目的不太適用。

Demo here

+0

這有效謝謝:)。只是爲了澄清,如果我使用從PropertyValues中選擇不同的rec,那麼(property =「age」或property =「name」)按值排列;假設名稱屬性將在那裏爲所有記錄?它會一直以相同的方式工作嗎? – Jerry

+0

您當前的查詢似乎與回答您的問題所需的內容相差甚遠。如果您有第二個問題,請澄清您的原始帖子,也許可以回答。 –

+0

你可以給我同樣的HQL查詢嗎?當我給出ON子句時,我得到意外的令牌ON,並且如果我不給出預期的加入錯誤的路徑,我得到 – Jerry

相關問題