Возврат первого символа DISTINCT поля (MySQL)
Я хотел бы создать список символов всех первых букв столбца в моей базе данных. SQL ниже сообщает, что я бы хотел вернуться.
SELECT DISTINCT first_character(name) FROM mydatabase
Есть ли способ сделать это в MySQL?
ИЗМЕНИТЬ
В чем преимущество использования SUBSTRING над LEFT и наоборот?
ИЗМЕНИТЬ
В настоящее время в таблице насчитывается около 1700 записей и растет.
Ответы
Ответ 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
.