Эта тема на forum.dklab.ru


Slaver: Вывод данных из MySQL по первой букве
Прочитал несколько советов по реализации вывода данных в зависимости от значения первой буквы, но ничего из предложенного не работает. Есть ли универсальный алгоритм вывода данных "по букве" (к примеру, если значение поля начинается с буквы "Г", то будут выведены все значенис поля, начинающиеся на букву "Г": гномик, гора, горшок :))
Наверное, нужно работать с LEFT(str,len), которая должна возвращает крайние слева len символов из строки str?
Юрий Насретдинов:
Наверное, нужно работать с LEFT(str,len), которая должна возвращает крайние слева len символов из строки str?
Ну, можно и так, а более оптимизированный вариант по скорости - это сделать отдельное поле типа char(1) с этой буквой, и искать уже по этому полю. Где-то на форуме уже было...
Slaver:
сделать отдельное поле типа char(1) с этой буквой, и искать уже по этому полюНаверное, так и сделаю :) Спасибо!
Maus:
Slaver
WHERE the_col LIKE "г%"
??
HardNik:
Юpий Насрeтдинов
Позвольте с Вами не согласиться, и присоединиться к недоумению Maus. Подобная оптимизация БД перечеркивает всю историю развития БД, в частности теорию РСУБД, многолетнее развитие MySQL.
Slaver:
SlaverWHERE the_col LIKE "г%"??
Я уже пробовал, но так не работает. Необходим вывод только в зависимости от первой буквы. А строка, где нужно искать "первую букву", может быть из нескольких слов...
Предложенный тобой способ работает, но выводит все строки, где есть "г"... :(
Maus:
Slaver
Предложенным мной способ выводит все строки, начинающиеся на "г" - знак "%" только с одной стороны. Сколько там слов - неважно
HardNik:
Slaver
Если позволите, выдержка и мануала:

В SQL при сравнении по шаблону символ `_' обозначает любой одиночный символ, а `%' - некоторое количество символов (включая ноль символов). В MySQL в SQL-шаблонах по умолчанию не учитывается регистр символов. При работе с шаблонами SQL использование операторов = или <> не допускается, вместо этого применяются операторы сравнения LIKE или NOT LIKE.
Найти все имена, начинающиеся с `b', можно следующим образом:
[sql]
mysql> SELECT * FROM pet WHERE name LIKE "b%";


Пробел также маскируется шаблоном %. Попробуйте еще раз.
Юрий Насретдинов:
Подобная оптимизация БД перечеркивает всю историю развития БД, в частности теорию РСУБД, многолетнее развитие MySQL.
Я же говорю - эта тема уже обсуждалась. LIKE 'г%' работает намного медленнее, чем предложенный вариант. Это факт. Точка.
Slaver:
Повозился... Выяснилось, что LIKE 'г%' некорректно работает с данными в кодировке UTF-8 (по крайней мере у меня). Поэтому извиняюсь, что пудрил мозги :)
Mich:
А вы корректно установите кодировку мускула и все будет работать.
Иван Шумков:
SET CHARACTER SET utf8;
Anonymous:
Скажите, а как быть, если нужно выбрать уникальные первые буквы из таблицы? Пробовал запрос:SELECT LEFT(field,1) FROM tbl ORDER BY fieldОн возвращает все буквы - в том числе и повторяющиеся. Попробовал избавиться с помощью GROUP BY:SELECT LEFT(field,1) AS fl FROM tbl GROUP BY fl ORDER BY fieldНо в этом случае результат вообще пустой.. хотя по идее должно работать? Версия MySQL - 4.0.13-log, с кодировками проблем замечено не было.
Maus:
Гость
а почему не SELECT DISTINCT LEFT(field,1) AS `letter` FROM tbl ORDER BY `letter` limit 3
Anonymous:
Так тоже пробовал. Результат тот же. Хотя я не уверен, что это именно "пустой результат". Мне это вообще какой-то мистикой видится. В общем, вот:mysql> SELECT DISTINCT LEFT(group_name,1) AS `letter` FROM phpbb_groups;
+--------+
| letter |
+--------+
| |
+--------+
1 row in set (0.00 sec)С GROUP BY аналогично - тоже 1 row in set, но почему-то пустой. В то же время, если без DISTINCT и GROUP BY:mysql> SELECT LEFT(group_name,1) AS `letter` FROM phpbb_groups;
+--------+
| letter |
+--------+
| A |
| A |
| |
| Т |
| М |
| Р |
| 3 |
| А |
| Т |
| А |
| П |
| Э |
| В |
| Л |
| Г |
| У |
| Ф |
| К |
| 3 |
| Д |
| – |
| К |
+--------+
22 rows in set (0.01 sec)
Maus:
Гость
может, в этой версии MySQL действительно был баг? У меня на MySQL 4.1.16 и 4.1.12-log запрос
SELECT DISTINCT LEFT(group_name,1) AS `letter` FROM phpbb_groups;
работает как ожидалось (пробовал через PMA).
Tamplier:
+--------+
| letter |
+--------+
| A |
| A |
| |
По всей видимости это NULL, возможно поэтому GROUP BY не отрабатывает?
bæv:
Tamplier, Вас не смущает, что вопрос почти пять лет назад задан?

Эта тема на forum.dklab.ru