【问题标题】:How do I use ORDER BY/GROUP BY to ignore some expression?如何使用 ORDER BY/GROUP BY 忽略某些表达式?
【发布时间】:2012-02-05 17:31:13
【问题描述】:

我需要组合在一起,比如 X 列,忽略括号内的内容

      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

谁能建议我如何克服这个场景。

谢谢。

【问题讨论】:

  • 请添加 a) 一些真实的行,b) 一些真实的 SQL 哦,通常要排除使用 WHERE 子句的行
  • 您想要ORDER BY 还是GROUP BY?这些做完全不同的事情! (从你想要的输出看起来你想要ORDER BY

标签: mysql database group-by sql-order-by


【解决方案1】:

您可以对派生值进行分组/排序,但这会妨碍使用索引,因此在大型表上性能会很糟糕:

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

注意: 只是想不通,所以这很可能行不通,但应该给你一个工作的基础。假设它有效,它会将字符串分成两部分 - 在 [ 之前和 ] 之后,将这两部分放在一起,然后对它们进行分组,有效地消除了 [...] 部分。

如果您经常做这种事情,那么我建议将此字段分成两个单独的字段,这样您就可以拥有专用/永久的“之前”和“之后”字段,这些字段可以更容易地被索引和分组/排序这个丑陋的怪物。

【讨论】:

  • 谢谢。我有这个想法并试图让它发挥作用。如果有效,将发布结果。
  • 我可以使用 RIGHT () 和 LOCATE() 修剪下部,并将其存储在临时表中,正如您所暗示的那样。然后做了 ORDER BY 来解决我的问题。非常感谢您的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多