Подтвердить что ты не робот

Возврат первого символа DISTINCT поля (MySQL)

Я хотел бы создать список символов всех первых букв столбца в моей базе данных. SQL ниже сообщает, что я бы хотел вернуться.

SELECT DISTINCT first_character(name) FROM mydatabase

Есть ли способ сделать это в MySQL?

ИЗМЕНИТЬ В чем преимущество использования SUBSTRING над LEFT и наоборот?

ИЗМЕНИТЬ В настоящее время в таблице насчитывается около 1700 записей и растет.

4b9b3361

Ответ 1

Извините за это, но я понял, что именно мне нужно было сделать сейчас.

SELECT DISTINCT LEFT(name, 1) FROM mydatabase

Это возвращает список первых, отдельных, одиночных символов, с которых начиналась каждая строка в столбце. Я добавил, что изменил его на следующее, чтобы получить его в алфавитном порядке:

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

Работает как шарм.

Ответ 2

Звучит просто:

select distinct substring(field,1,1) as char
from mytable

Ответ 3

Для вашей текущей таблицы строк 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.