2017-06-01 73 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循环更好。谢谢你的时间 :) –