我想在我的数据库中生成列的所有首字母的字符列表。下面的SQL会让我想要回归。
SELECT DISTINCT first_character(name) FROM mydatabase
有没有办法在MySQL中执行此操作?
修改 使用SUBSTRING比LEFT更有优势,反之亦然?
修改 目前,该表中有大约1700条记录并且还在增长。
答案 0 :(得分:64)
很抱歉这样做,但我确切地想出了我现在需要做的事情。
SELECT DISTINCT LEFT(name, 1) FROM mydatabase
这返回了列中每行开头的第一个不同的单个字符的列表。我添加了更改为以下内容以字母数字顺序获取列表:
SELECT DISTINCT LEFT(name, 1) as letter FROM mydatabase ORDER BY letter
像魅力一样。
答案 1 :(得分:9)
听起来很简单:
select distinct substring(field,1,1) as char
from mytable
答案 2 :(得分:9)
对于您当前的1,700
行表,您的解决方案就可以了。
如果您有100,000
行,DISTINCT
可能会效率低下。
以下是我博客中的文章,该文章展示了如何有效地完成这项工作:
此解决方案使用name
上的索引。它将跳过索引键,最多选择一个首字母。
首先,您需要创建一个函数:
CREATE FUNCTION fn_get_next_code(initial INT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE _next VARCHAR(200);
DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL;
SELECT ORD(SUBSTRING(name, 1, 1))
INTO _next
FROM t_names
WHERE name >= CHAR(initial + 1)
ORDER BY
name
LIMIT 1;
RETURN _next;
END
这个函数,给定一个起始字母的代码,返回表格中给定的第一个起始字母。
其次,在查询中使用此函数:
SELECT CHAR(@r) AS starting,
@r := fn_get_next_letter(@r) AS next
FROM (
SELECT @r := ORD(LEFT(MIN(name), 1))
) vars, mytable
WHERE @r IS NOT NULL
在每次迭代中,会话变量@r
将使用索引跳到下一个起始字母。
这将非常快,但只有当你有数十万行时才能收回成本。
否则只需使用DISTINCT
。