Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Вывод данных из MySQL по первой букве (Slaver)
Author Message
Slaver
Заглянувший



Joined: 27 Dec 2003
Posts: 19
Карма: 0
   поощрить/наказать

Location: Минск

PostPosted: Sat Jul 30, 2005 12:32 am ()
   Post subject: Вывод данных из MySQL по первой букве
Reply with quote

Прочитал несколько советов по реализации вывода данных в зависимости от значения первой буквы, но ничего из предложенного не работает. Есть ли универсальный алгоритм вывода данных "по букве" (к примеру, если значение поля начинается с буквы "Г", то будут выведены все значенис поля, начинающиеся на букву "Г": гномик, гора, горшок :))
Наверное, нужно работать с LEFT(str,len), которая должна возвращает крайние слева len символов из строки str?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Sat Jul 30, 2005 12:48 am (спустя 16 минут; написано за 52 секунды)
   Post subject:
Reply with quote

Slaver wrote:
Наверное, нужно работать с LEFT(str,len), которая должна возвращает крайние слева len символов из строки str?
Ну, можно и так, а более оптимизированный вариант по скорости - это сделать отдельное поле типа char(1) с этой буквой, и искать уже по этому полю. Где-то на форуме уже было...
Back to top
View user's profile Send private message Send e-mail
Slaver
Заглянувший



Joined: 27 Dec 2003
Posts: 19
Карма: 0
   поощрить/наказать

Location: Минск

PostPosted: Sat Jul 30, 2005 3:24 pm (спустя 14 часов 35 минут; написано за 16 секунд)
   Post subject:
Reply with quote

Quote:
сделать отдельное поле типа char(1) с этой буквой, и искать уже по этому полю
Наверное, так и сделаю :) Спасибо!
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sun Jul 31, 2005 12:16 am (спустя 8 часов 52 минуты; написано за 34 секунды)
   Post subject:
Reply with quote

Slaver
Code (SQL): скопировать код в буфер обмена
WHERE the_col LIKE "%"
??
Back to top
View user's profile Send private message
HardNik
Участник форума



Joined: 03 Feb 2005
Posts: 183
Карма: 12
   поощрить/наказать

Location: Бишкек, Кыргызская Республика

PostPosted: Sun Jul 31, 2005 1:20 am (спустя 1 час 3 минуты; написано за 3 минуты 46 секунд)
   Post subject:
Reply with quote

Юpий Насрeтдинов
Позвольте с Вами не согласиться, и присоединиться к недоумению Maus. Подобная оптимизация БД перечеркивает всю историю развития БД, в частности теорию РСУБД, многолетнее развитие MySQL.
Back to top
View user's profile Send private message
Slaver
Заглянувший



Joined: 27 Dec 2003
Posts: 19
Карма: 0
   поощрить/наказать

Location: Минск

PostPosted: Sun Jul 31, 2005 9:47 am (спустя 8 часов 27 минут; написано за 44 секунды)
   Post subject:
Reply with quote

Maus wrote:
Slaver
Code (SQL): скопировать код в буфер обмена
WHERE the_col LIKE "%"
??
Я уже пробовал, но так не работает. Необходим вывод только в зависимости от первой буквы. А строка, где нужно искать "первую букву", может быть из нескольких слов...
Предложенный тобой способ работает, но выводит все строки, где есть "г"... :(
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sun Jul 31, 2005 11:27 am (спустя 1 час 39 минут; написано за 2 минуты 10 секунд)
   Post subject:
Reply with quote

Slaver
Предложенным мной способ выводит все строки, начинающиеся на "г" - знак "%" только с одной стороны. Сколько там слов - неважно
Back to top
View user's profile Send private message
HardNik
Участник форума



Joined: 03 Feb 2005
Posts: 183
Карма: 12
   поощрить/наказать

Location: Бишкек, Кыргызская Республика

PostPosted: Sun Jul 31, 2005 12:13 pm (спустя 46 минут)
   Post subject:
Reply with quote

Slaver
Если позволите, выдержка и мануала:
Code (any language): скопировать код в буфер обмена
В SQL при сравнении по шаблону символ `_' обозначает любой одиночный символ, а `%' - некоторое количество символов (включая ноль символов). В MySQL в SQL-шаблонах по умолчанию не учитывается регистр символов. При работе с шаблонами SQL использование операторов = или <> не допускается, вместо этого применяются операторы сравнения LIKE или NOT LIKE.
Найти все имена, начинающиеся с `b', можно следующим образом:
[sql]
mysql> SELECT * FROM pet WHERE name LIKE "b%";
[/code]
Пробел также маскируется шаблоном %. Попробуйте еще раз.
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Tue Aug 09, 2005 11:30 pm (спустя 9 дней 11 часов 17 минут; написано за 44 секунды)
   Post subject:
Reply with quote

HardNik wrote:
Подобная оптимизация БД перечеркивает всю историю развития БД, в частности теорию РСУБД, многолетнее развитие MySQL.
Я же говорю - эта тема уже обсуждалась. LIKE 'г%' работает намного медленнее, чем предложенный вариант. Это факт. Точка.
Back to top
View user's profile Send private message Send e-mail
Slaver
Заглянувший



Joined: 27 Dec 2003
Posts: 19
Карма: 0
   поощрить/наказать

Location: Минск

PostPosted: Tue Aug 09, 2005 11:47 pm (спустя 16 минут)
   Post subject:
Reply with quote

Повозился... Выяснилось, что LIKE 'г%' некорректно работает с данными в кодировке UTF-8 (по крайней мере у меня). Поэтому извиняюсь, что пудрил мозги :)
Back to top
View user's profile Send private message
Mich
Участник форума
Warnings: 1


Joined: 15 Jun 2005
Posts: 197
Карма: -3
   поощрить/наказать


PostPosted: Wed Aug 10, 2005 6:20 pm (спустя 18 часов 33 минуты; написано за 40 секунд)
   Post subject:
Reply with quote

А вы корректно установите кодировку мускула и все будет работать.
Back to top
View user's profile Send private message Send e-mail
Иван Шумков
Участник форума



Joined: 30 Dec 2004
Posts: 229
Карма: 6
   поощрить/наказать

Location: Россия, Санкт-Петербург

PostPosted: Fri Aug 12, 2005 11:25 pm (спустя 2 дня 5 часов 5 минут; написано за 1 секунду)
   Post subject:
Reply with quote

Code (SQL): скопировать код в буфер обмена
SET CHARACTER SET utf8;
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 07, 2006 2:50 pm (спустя 5 месяцев 25 дней 15 часов 25 минут; написано за 1 минуту 58 секунд)
   Post subject:
Reply with quote

Скажите, а как быть, если нужно выбрать уникальные первые буквы из таблицы? Пробовал запрос:
Code (any language): скопировать код в буфер обмена
SELECT LEFT(field,1) FROM tbl ORDER BY field
Он возвращает все буквы - в том числе и повторяющиеся. Попробовал избавиться с помощью GROUP BY:
Code (any language): скопировать код в буфер обмена
SELECT LEFT(field,1) AS fl FROM tbl GROUP BY fl ORDER BY field
Но в этом случае результат вообще пустой.. хотя по идее должно работать? Версия MySQL - 4.0.13-log, с кодировками проблем замечено не было.
Back to top
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Feb 07, 2006 3:10 pm (спустя 19 минут; написано за 36 секунд)
   Post subject:
Reply with quote

Гость
а почему не
Code (SQL): скопировать код в буфер обмена
SELECT DISTINCT LEFT(FIELD,1) AS `letter` FROM tbl ORDER BY `letter` LIMIT 3
Back to top
View user's profile Send private message
Guest






Карма: 388
   поощрить/наказать


PostPosted: Tue Feb 07, 2006 3:15 pm (спустя 5 минут; написано за 1 минуту 49 секунд)
   Post subject:
Reply with quote

Так тоже пробовал. Результат тот же. Хотя я не уверен, что это именно "пустой результат". Мне это вообще какой-то мистикой видится. В общем, вот:
Code (any language): скопировать код в буфер обмена
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:
Code (any language): скопировать код в буфер обмена
mysql> SELECT LEFT(group_name,1) AS `letter` FROM phpbb_groups;
+--------+
| letter |
+--------+
| A      |
| A      |
|        |
| Т      |
| М      |
| Р      |
| 3      |
| А      |
| Т      |
| А      |
| П      |
| Э      |
| В      |
| Л      |
| Г      |
| У      |
| Ф      |
| К      |
| 3      |
| Д      |
| –      |
| К      |
+--------+
22 rows in set (0.01 sec)
Back to top
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Feb 07, 2006 4:22 pm (спустя 1 час 6 минут; написано за 1 минуту 10 секунд)
   Post subject:
Reply with quote

Гость
может, в этой версии MySQL действительно был баг? У меня на MySQL 4.1.16 и 4.1.12-log запрос
Code (SQL): скопировать код в буфер обмена
SELECT DISTINCT LEFT(group_name,1) AS `letter` FROM phpbb_groups;
работает как ожидалось (пробовал через PMA).
Back to top
View user's profile Send private message
Tamplier
Заглянувший



Joined: 23 Feb 2004
Posts: 11
Карма: 0
   поощрить/наказать

Location: Sevastopol

PostPosted: Tue Jan 11, 2011 5:30 pm (спустя 4 года 11 месяцев 4 дня 1 час 8 минут; написано за 36 секунд)
   Post subject:
Reply with quote

+--------+
| letter |
+--------+
| A |
| A |
| |
По всей видимости это NULL, возможно поэтому GROUP BY не отрабатывает?
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9986
   поощрить/наказать


PostPosted: Tue Jan 11, 2011 6:07 pm (спустя 36 минут; написано за 58 секунд)
   Post subject:
Reply with quote

Tamplier, Вас не смущает, что вопрос почти пять лет назад задан?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML