这里可能的想法: -
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 记录)。
编辑 - 好再试一次。
您的基本查询归结为这一点(忽略填写空白):-
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 秒(并且 name 字段甚至没有被索引)。
添加联合选择不会为查询增加任何明显的时间:-
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
如果这在你的机器上需要 36 秒左右,那么就会发生一些奇怪的事情