返回字段的DISTINCT第一个字符(MySQL)

cha*_*dgh 22 mysql sql

我想在我的数据库中生成列的所有首字母的字符列表.下面的SQL会让我想要回归.

SELECT DISTINCT first_character(name) FROM mydatabase

有没有办法在MySQL中这样做?

编辑 使用SUBSTRING比LEFT更有优势,反之亦然?

编辑 目前,该表中有大约1700条记录并且还在增长.

cha*_*dgh 65

很抱歉这样做,但我确切地想出了我现在需要做的事情.

SELECT DISTINCT LEFT(name, 1) FROM mydatabase

这返回了列中每行开头的第一个不同的单个字符的列表.我添加了更改为以下内容以字母数字顺序获取它:

SELECT DISTINCT LEFT(name, 1) as letter FROM mydatabase ORDER BY letter

奇迹般有效.


And*_*mar 10

听起来很简单:

select distinct substring(field,1,1) as char
from mytable
Run Code Online (Sandbox Code Playgroud)

  • @Sonny:道歉,我认为这个问题是关于SQL Server的,但它是关于MySQL的. (2认同)

Qua*_*noi 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
Run Code Online (Sandbox Code Playgroud)

给定起始字母的代码,此函数返回表格中给定的第一个起始字母.

其次,在查询中使用此函数:

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
Run Code Online (Sandbox Code Playgroud)

在每次迭代时,会话变量@r将使用索引跳到下一个起始字母.

这将非常快,但只有当你有数十万行时它才能收回成本.

否则只需使用DISTINCT.