0

我正在構建客戶的數據庫模式&而不是永久性地添加列,我寧願使用EAV(實體屬性值)Magento樣式將此數據存儲在其他表中並聯系起來。EAV建模的數據庫模式 - 查詢建議

我的SQL小提琴會給結構 http://sqlfiddle.com/#!2/82a70

一個更好的想法。在這種情況下我會想生成顯示所有的客戶與存儲的其他表中,如果他們的相關信息的查詢例如,客戶沒有爲特定的實體獲取值,它只顯示NULL。

如我,我會想顯示輸出如下:

customer_id | first_name | surname | profession | club 
     1   bob  geldof  singer  NULL 
     2   lionel  messi  footballer barcelona fc 

任何人都可以提出最優化的MySQL查詢生產的基礎上,這個記錄可能有許多以後添加更多的實體或屬性?

+1

抱歉,但'最優化的MySQL查詢產生這種recordset'將要求您不要使用EAV。通過使用EAV,您需要針對每個結果集屬性列使用「左連接」。 –

+0

@KM我同意,我剛剛進入EAV,並希望'盡我所能',即使腳趾在路上被燒燬:) – user2689136

+0

你沒有義務爲每條記錄加入連接 - 但這很可能在性能方面的最佳解決方案。 BTW – Strawberry

回答

1

這種類型的SQL查詢將生成您正在查找的表,但您必須根據您的'eav_attribute'表的內容動態生成此查詢。

正如KM表示,每個屬性需要另一個LEFT JOIN

SELECT 
    customer_entity.customer_id AS customer_id, 
    name.value AS firstname, 
    surname.value AS surname, 
    profession.value AS profession, 
    club.value AS club 
FROM customer_entity 
    LEFT JOIN customer_varchar AS name 
    ON name.entity_id = customer_entity.customer_id AND name.attribute_id = 1 
    LEFT JOIN customer_varchar AS surname 
    ON surname.entity_id = customer_entity.customer_id AND surname.attribute_id = 2 
    LEFT JOIN customer_varchar AS profession 
    ON profession.entity_id = customer_entity.customer_id AND profession.attribute_id = 3 
    LEFT JOIN customer_varchar AS club 
    ON club.entity_id = customer_entity.customer_id AND club.attribute_id = 4 
; 
+0

歡呼聲邁克 - 那看起來不錯:) – user2689136