【问题标题】:Grouping SQL recordset by/into alphabetical order with a letter range将 SQL 记录集按/按字母顺序和字母范围分组
【发布时间】:2012-04-29 15:44:05
【问题描述】:

通常我会先做好功课,但我现在快到最后期限了,我想我会把它扔出去寻求帮助,主要是因为我从以前的经验中知道,任何我认为复杂的事情实际上都是SQL 轻而易举。

我希望按字母范围对结果进行分组,而不仅仅是单个字母。所以,最终我希望我的输出类似于

ABCD:
-- Alpha
-- Bravo
-- Charlie
-- Delta

EFGH:
-- Echo
-- Foxtrot
-- Gulf
-- Hotel

到目前为止,我一直在使用ORDER BY LOWER(name) ASC,然后只是将记录复制到数组结构中以获取单个字母分组(A、B、C 等),但这需要扩展为按字母范围分组,我想知道有没有更快/更有效的方法。

纯 SQL 解决方案?还是用 PHP 进行后处理?

提示、技巧、完整答案一如既往地受到赞赏。

【问题讨论】:

  • 你不能只ORDER BY name 并将结果“分组”到你的应用程序 (PHP) 代码中吗?我认为没有必要使用GROUP BY
  • 除非你只想要计数(ABCD : 4EFGH : 4IJKL : 0、...、YZ : 0
  • 是的,我不明白你是如何在 SQL 中“分组”它们的,因为你仍然必须按字母顺序列出它们。
  • 我在任何地方都没有说过我正在使用 GROUP BY - @ypercube:我已经在使用 ORDER BY 名称来获取结果,然后使用 PHP 将记录捆绑在一起 -信组。我只是想知道 SQL 中是否有任何东西可以为我加快这个过程,而不是编写更多的 PHP 来将一个字母范围内的记录捆绑在一起。
  • 我没有看到任何东西可以做这样的事情。老实说,我看不出“这样的事情”会是什么。您的行按您想要的顺序从 MySQL 返回。对于“捆绑”,我猜您的意思是将行拆分为组,并在每个组之前放置一个标题。这将是 PHP 中的一个简单检查(前一行与当前行)。

标签: mysql grouping alphabetical


【解决方案1】:

这有点难看,但尝试像这样使用 UNION:

SELECT * FROM (
    SELECT 'ABCD' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('A','B','C','D')
    UNION
    SELECT 'EFGH' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('E','F','G','H')
    UNION
    SELECT 'IJKL' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('I','J','K','L')
    UNION
    SELECT 'MNOP' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('M','N','O','P')
    UNION
    SELECT 'QRST' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('Q','R','S','T')
    UNION
    SELECT 'UVWX' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('U','V','W','X')
    UNION
    SELECT 'YZ' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('Y','Z')
) AS myResults ORDER BY mygroup,name

在 GROUP BY 中添加一点会得到像 COUNT 这样的汇总结果:

SELECT myGroup, COUNT(name) as myGroupCount FROM (
    SELECT 'ABCD' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('A','B','C','D')
    UNION
    SELECT 'EFGH' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('E','F','G','H')
    UNION
    SELECT 'IJKL' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('I','J','K','L')
    UNION
    SELECT 'MNOP' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('M','N','O','P')
    UNION
    SELECT 'QRST' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('Q','R','S','T')
    UNION
    SELECT 'UVWX' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('U','V','W','X')
    UNION
    SELECT 'YZ' AS myGroup, name FROM users WHERE LEFT(name,1) IN ('Y','Z')
) AS myResults GROUP BY mygroup ORDER BY mygroup,name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2018-12-03
    • 2017-02-28
    相关资源
    最近更新 更多