2017-06-01 100 views
-2

我在mysql中具有以下類型的字符串屬性。 每個屬性都有逗號分隔值。mysql - 字符串列表的所有可能的組合

Attr1: A, B, C, D 
Attr2: E, F, G, H 
Attr3: I, J, K, L 

我需要上述屬性和值的每個獨特組合。 像:

AEI 
AFI 
BEI 

等等....

現在,我使用嵌套while循環來達到相同的。 但是,隨着每個屬性和逗號分隔值的增加,性能開始下降。

你能幫我用更好的方法來實現嗎?

+2

讓我們知道你已經試過沒 –

+0

@Ankit我嘗試正常嵌套while循環。首先分割第一個屬性,而不是分割第二個屬性的另一個while循環。然後在它內部第三個分割第三個屬性的循環等等。 –

+0

你的循環中是否有mysql查詢?你能分享一個嵌套while循環的例子嗎? – Sevle

回答

1

你能幫我用更好的方法來實現嗎?

如果您對錶格進行規範化,則可以使用交叉連接來生成組合列表。它會解決你的問題,但它不會很好地擴展。

查詢

SELECT 
    CONCAT(Attr1.value, Attr2.value, Attr3.value) 
FROM 
Attr1 
CROSS JOIN 
Attr2 
CROSS JOIN 
Attr3 
ORDER BY 
Attr1.value ASC 

結果

| CONCAT(Attr1.value, Attr2.value, Attr3.value) | 
|-----------------------------------------------| 
|           AEI | 
|           AEK | 
|           AHI | 
|           AHK | 
|           AGJ | 
|           AGL | 
|           AFI | 
|           AFK | 
|           AEJ | 
|           AEL | 
|           AHJ | 
|           AHL | 
|           AGI | 
.... 
.... 
.... 

看到演示http://www.sqlfiddle.com/#!9/285e41/4

+0

非常感謝您的解決方案。 :)我會嘗試使用相同的,看看它在性能上有什麼不同。 –

+1

@VanitaArora。 。 。如果您有逗號分隔的值,那麼此解決方案不起作用。 –

+0

@GordonLinoff我將在臨時表中分隔逗號分隔值,然後在所有表上執行外連接。我仍然不確定表現,但我認爲它會比我使用的基本while循環更好。謝謝你的時間 :) –

相關問題