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

时间:2009-05-07 21:06:53

标签: sql mysql

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

SELECT DISTINCT first_character(name) FROM mydatabase

有没有办法在MySQL中执行此操作?

修改 使用SUBSTRING比LEFT更有优势,反之亦然?

修改 目前,该表中有大约1700条记录并且还在增长。

3 个答案:

答案 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