2012-01-09 83 views
0

我需要组合在一起,说列X,忽略什么是支架如何使用ORDER BY/GROUP BY忽略某些表达式?

 X 

aaabbbccc[0]aaabbbccc 
aaabbbccc[15]aaabbbccc 
aaabbbccc[11]eeefffggg 
aaabbbccc[10]eeefffggg 
aaabbbccc[17]aaabbbccc 
aaabbbccc[19]eeefffggg 

至于里面,

 X 

aaabbbccc[0]aaabbbccc 
aaabbbccc[15]aaabbbccc 
aaabbbccc[17]aaabbbccc 
aaabbbccc[10]eeefffggg 
aaabbbccc[11]eeefffggg 
aaabbbccc[19]eeefffggg 

不过,如果我使用ORDER BY或GROUP BY,我总是得到如下。

aaabbbccc[0]aaabbbccc 
aaabbbccc[10]eeefffggg 
aaabbbccc[11]eeefffggg 
aaabbbccc[15]aaabbbccc 
aaabbbccc[17]aaabbbccc 
aaabbbccc[19]eeefffggg 

任何人都可以请建议我该如何克服这个scenerio。

谢谢。

+0

请添加a)一些真正的行,b)一些真正的SQL哦,并且通常用于排除使用WHERE子句的行 – 2012-01-09 04:52:16

+0

是否需要'ORDER BY'或'GROUP BY'?这些做了完全不同的事情! (从你想要的输出看起来像'ORDER BY') – 2012-01-09 04:58:05

回答

1

你可以在派生值组/订单,虽然这排除了使用指数因此性能将是非常糟糕的大表:

SELECT ... 
... 
GROUP BY CONCAT(
    LEFT(yourfield, LOCATE('[', yourfield)), 
    RIGHT(yourfield, LENGTH(yourfield) - LOCATE(']', yourfield)) 
); 

注:只是去了我的头顶部,所以这个最可能无法工作,但应该给你一个工作的基础。假设它起作用,它会将字符串分成两部分 - 在[之前和]之后,将这两部分放在一起,然后对它们进行分组,从而有效地消除[...]部分。

如果你经常做这类事情,那么我建议把这个字段分成两个单独的字段,所以你有专用/永久的'之前'和'后'字段,可以更容易索引和分组/排序比这个丑陋的怪物。

+0

谢谢。我有这个想法,并试图使其工作。如果结果正确,将会发布结果。 – ppoudel 2012-01-09 05:11:21

+0

我可以使用RIGHT()和LOCATE()修剪下半部分,并将其存储在一个临时表中,就像您暗示的那样。然后做了ORDER BY来解决我的问题。非常感谢这个想法。 – ppoudel 2012-01-09 06:21:25