我想在我的数据库中生成列的所有首字母的字符列表.下面的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)
对于当前的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.
| 归档时间: |
|
| 查看次数: |
36521 次 |
| 最近记录: |