가능한 아이디어 : -
SELECT FirstLetter, MAX(name), SUM(NameCount)
FROM
(
SELECT substr(name, 1, 1) AS FirstLetter, MIN(name) AS name, COUNT(*) AS NameCount
FROM company
GROUP BY FirstLetter
UNION
SELECT 'A' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'B' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'C' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'D' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'E' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'F' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'G' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'H' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'I' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'J' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'K' AS FirstLetter, "" AS name, 0 AS NameCount
UNION
SELECT 'L' AS FirstLetter, "" AS name, 0 AS NameCount
) sub1
GROUP BY FirstLetter
(나는 간격을 작성하기에 노동 조합에 가능한 문자를 입력 지루있어).
이것은 작동하지만 테이블의 성능에 대해서는 확신 할 수 없습니다 (내가 가지고있는 임의의 테이블/필드에서 약 140k 레코드로 1 초가 걸립니다).
EDIT - 다시 시도하십시오.
기본적인 쿼리 (빈칸을 채우는 무시)이 내려 온다 : -
SELECT CASE WHEN name REGEXP '[A-Za-z].*' THEN UPPER(SUBSTR(name, 1, 1)) ELSE '@' END as formatted_letter, MIN(id) AS id, COUNT(*) AS NameCount
FROM users
GROUP BY formatted_letter
이 그 자체로 매우 효율적이어야한다. 시도 해보고 얼마나 걸릴지 알려주세요.
이것이 빠르면 노동 조합에서 제로 카운트 레코드를 추가하는 것이 공칭 시간을 추가해야합니다.
140k 레코드가있는 임의의 테이블에서 시도한 결과 나에게 약 1 초가 걸렸으며 이름 필드도 인덱싱되지 않았습니다.
UNION을 선택에 추가하면 쿼리에 띄는 시간을 추가하지 않습니다 -
SELECT formatted_letter, MAX(name), SUM(NameCount)
FROM
(
SELECT CASE WHEN company REGEXP '[A-Za-z].*' THEN UPPER(SUBSTR(company, 1, 1)) ELSE '@' END as formatted_letter, MIN(id) AS id, COUNT(*) AS NameCount
FROM users
GROUP BY formatted_letter
UNION
SELECT 'A' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'B' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'C' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'D' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'E' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'F' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'G' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'H' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'I' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'J' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'K' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'L' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'M' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'N' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'O' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'P' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'Q' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'R' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'S' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'T' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'U' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'V' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'W' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'X' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'Y' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT 'Z' AS formatted_letter, "" AS id, 0 AS NameCount
UNION SELECT '@' AS formatted_letter, "" AS id, 0 AS NameCount
) Sub1
GROUP BY formatted_letter
을이 후 이상한 일이
나는이 아이디어를 이미 시도했다는 것을 나의 포스트에서 설명한다 ... 그리고 이것은 최악이다! – pierallard
이것은 끝에 오는 여분의 글자 (0 카운트 포함)에서만 병합됩니다. 이 단계에서는 적은 수의 행만 다루기 때문에 매우 효율적이어야합니다. 나는 원래의 글에서 각 글자에 대해 한 번 전체 쿼리를 수행 한 다음 그 결과를 병합하는 것으로 추측했다. (느림) – Kickstart
추가 세부 사항. – Kickstart