2015-07-10 30 views
1

目前,我有以下EAV表:EAV表中選擇不加入

和標準表:

id 
first_name 
last_name 

我加入了標準表到EAV表中的每個匹配值的ID,所以我的查詢看起來像這樣:

SELECT id, first_name, last_name, fieldname1, fieldname2 
FROM standard_table 
LEFT JOIN EAV AS fieldname1 ON 
    (fieldname1.id = standard_table.id AND fieldname1.field_name = 'fieldname1') 
LEFT JOIN EAV AS fieldname2 ON 
    (fieldname2.id = standard_table.id AND fieldname2.field_name = 'fieldname2'); 

這一直工作正常,直到今天,我現在我的EAV表中有62個自定義字段,這意味着我的查詢連接到62個表,因此觸及MySQL表連接限制和失敗。

整個查詢似乎是一個不好的方法,我怎麼能重寫這個,所以它更快,不需要62個表連接。

+0

[如何轉動一個MySQL實體屬性值架構(http://stackoverflow.com/questions/649802/how-to-pivot-a-mysql-entity-attribute-value-schema) –

+0

如果顯示你需要的輸出,那麼可以得到更好的幫助。 –

回答

1

您也可以使用EAV的聚合。查詢如下:

SELECT st.id, st.first_name, st.last_name, 
     MAX(CASE WHEN EAV.field_name = 'fieldname1' THEN fieldname1 END), 
     MAX(CASE WHEN EAV.field_name = 'fieldname2' THEN fieldname2 END) 
FROM standard_table st JOIN 
    EAV 
    ON EAV.id = st.id 
GROUP BY st.id, st.first_name, st.last_name; 

由於您獲得的列越來越多,這可以比數十個連接執行得更好。

+0

可能@Mike Oram需要單行id,first_name,last_name的多行,而您的查詢將只提供最大值。 –

+0

我認爲這會做到。這個關係在standard_table中只有1行,它連接到EAV中每個字段名稱的1,所以這應該足夠了,現在將會測試它 –

+0

@ ZafarMalik。 。 。如果你願意,你可以使用'GROUP_CONCAT()'而不是'MAX()'。 EAV模型通常每個字段名稱都有一個值,除了某些衆所周知的字段。 –

0

另外提供的答案是這樣做的靈感,但是我下面是我實際使用的查詢:

SELECT st.id, st.first_name, st.last_name, 
    (CASE WHEN `EAV`.`field_name` = 'fieldname1' THEN `EAV`.`field_value` END) AS 'fieldname1', 
    (CASE WHEN `EAV`.`field_name` = 'fieldname2' THEN `EAV`.`field_value` END) AS 'fieldname2', 
FROM standard_table st JOIN 
EAV 
ON EAV.id = st.id 
GROUP BY st.id; 
+0

我發現這實際上導致了一個問題,即在發現別名後,別名覆蓋了該值 –