0

Normally I'd do my homework properly first, but I'm up against a deadline now and thought I'd throw this out there for some help, mainly because I know from previous experience anything I think is complex is actually a breeze for SQL.

I'm looking to group my results by a letter range, not just an individual letter. So, ultimately I'd like my output to be something like

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

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

Until now I've been using ORDER BY LOWER(name) ASC and then just copying records into an array structure to get the single letter grouping (A, B, C, etc.), but that would need expanding to group by a letter range, and I'm wondering it there's a faster/more efficient way of doing it.

Pure SQL solution? Or post-processing in PHP?

Tips, tricks, full answers appreciated as always.

4

1 回答 1

0

这有点难看,但尝试像这样使用 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
于 2012-04-29T16:21:06.887 回答