0

通常は最初に宿題をきちんとやりますが、今は締め切りに間に合わず、助けを求めてこれを捨てようと思っていました。主な理由は、以前の経験から、複雑だと思うものは実際にはSQLにとって簡単だということを知っているからです。 。

個々の文字だけでなく、文字の範囲で結果をグループ化したいと考えています。ですから、最終的には私の出力を次のようなものにしたいと思います

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

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

これまでORDER BY LOWER(name) ASC、レコードを配列構造にコピーして1文字のグループ化(A、B、Cなど)を取得してきましたが、文字範囲でグループ化するために拡張する必要があり、疑問に思っています。それを行うためのより速く/より効率的な方法があります。

純粋なSQLソリューション?またはPHPで後処理しますか?

ヒント、トリック、完全な答えはいつものように高く評価されています。

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 に答える