WebTown.Info - Форум для вебмастера

Вернуться   WebTown.Info - Форум для вебмастера > 3. Программирование > MySQL


Ответ
 
Опции темы Опции просмотра
Старый 05.11.2006, 23:55   #1
ПознавшийТьму
Senior Member
 
Регистрация: 22.05.2006
Адрес: Киев
Сообщений: 205
Отправить сообщение для ПознавшийТьму с помощью ICQ Отправить сообщение для ПознавшийТьму с помощью MSN

По умолчанию регулярные выражения в MySQL

Я уже разные регулярные выражения попробовал но что-то моих знаний не хватает. Так что прошу о помощи. Задача следующая.
БД содержит таблицу keywords. В ней есть название файла name(речь идёт о картинках) и ассацируемые ключевые слова keywords. Они отделяются запятыми. Вобщем это может выглядеть вот так:
собака, большая собака,озеро, солнце ,облака,лето
Может быть просто одно слово:
собака
Тоесть слова между собой отделены произвольным количеством пробелов и одной запятой. Но если слово одно, то никаких запятых нету. Даётся слово и надо найти все записи с этим словом. Я сделал вот такое:
'(,)*( )*($key)( )*(,)*'
Но это явно неправильно так как если $key=99 оно мне находит и там где ...,999,... и ...,9999,... и ...,9699,... . Кто-то может помочь?
__________________
Nightfall seems to come my way
and it seems as if to stay
ПознавшийТьму вне форума   Ответить с цитированием
Старый 06.11.2006, 00:46   #2
ПознавшийТьму
Senior Member
 
Регистрация: 22.05.2006
Адрес: Киев
Сообщений: 205
Отправить сообщение для ПознавшийТьму с помощью ICQ Отправить сообщение для ПознавшийТьму с помощью MSN

По умолчанию

Ну вот что я придумал. Это чудо прошло только поверхностное тестирование и я пока не могу наверняка говорить о правильности.
Код:
((,){1}( )*($key)( )*(,){1})|(^($key)( )*(,){1})|(^($key)$)|((,){1}($key)$))
И тем не менее, подскажите более элегантное решение. А то при сравнении этого кода и элегантности как-то смешно становится.
__________________
Nightfall seems to come my way
and it seems as if to stay
ПознавшийТьму вне форума   Ответить с цитированием
Старый 08.11.2006, 12:15   #3
Black Raven
Senior Member
 
Регистрация: 21.10.2005
Адрес: Moscow
Сообщений: 362

По умолчанию

Честно - не сумел решить задачу с данными условиями... (регулярное выражение должно быть из разряда ,?\s+?WORD\s+?,?)
С другой стороны реализация неправильная (имхо)
Правильней было бы создать 2 таблицы, а еще правильней 3

С двумя таблицами: первая содержит имена картинок + id картинки, вторая id картинки + слово - делаем select на вторую таблицу и left join первую...

С тремя: в первой хранится инфа о картинках, во второй ВСЕ ВОЗМОЖНЫЕ КЛЮЧЕВЫЕ СЛОВА, в третьей кросс... Находим слово, LEFT JOIN кросс LEFT JOIN картинки...
__________________
Баг, проявишийся при сдаче заказчику, является фичей...
Black Raven вне форума   Ответить с цитированием
Старый 08.11.2006, 19:31   #4
ПознавшийТьму
Senior Member
 
Регистрация: 22.05.2006
Адрес: Киев
Сообщений: 205
Отправить сообщение для ПознавшийТьму с помощью ICQ Отправить сообщение для ПознавшийТьму с помощью MSN

По умолчанию

Ну я таки сумел решить задачу, но как видишь это регулярное вырпжение представляет собой полный перебор всех вариантов размещения слова в строке. Я не понял твою идею реализации. Возможно моих знаний в MySQL не хватает. Можешь поподробнее рассказать?
Я храню данные в столбце с типом text. Слова разделены запятыми и поэтому единственный способ организовать поиск, как я вижу, это регулярные выражения. Я не могу создать для каждого слова по столбцу так как я не знаю заранее сколько штук админ захочет ввести для какой-то картинки.
__________________
Nightfall seems to come my way
and it seems as if to stay
ПознавшийТьму вне форума   Ответить с цитированием
Старый 10.11.2006, 15:51   #5
ПознавшийТьму
Senior Member
 
Регистрация: 22.05.2006
Адрес: Киев
Сообщений: 205
Отправить сообщение для ПознавшийТьму с помощью ICQ Отправить сообщение для ПознавшийТьму с помощью MSN

По умолчанию

В моём регулярном выражении ошибки. так что просто для тех кто будет простматривать это, вот последняя версия
Код:
((,){1}( )*(".$key.")( )*(,){1})|(^( )*(".$key.")( )*(,){1})|(^( )*(".$key.")( )*$)|((,){1}( )*(".$key.")( )*$)
__________________
Nightfall seems to come my way
and it seems as if to stay
ПознавшийТьму вне форума   Ответить с цитированием
Старый 12.11.2006, 15:16   #6
Black Raven
Senior Member
 
Регистрация: 21.10.2005
Адрес: Moscow
Сообщений: 362

По умолчанию

говоря, что не смог решить задачу я подразумевал, что не смог решить элегантно... такое регулярное выражение не является элегантным решением (на мой взгляд).

вообще совершенно неправильно хранятся данные, поэтому столько геммороя при работе с ними.

самое простое решение без изменения структуры бд - почему бы не обрабатывать строку слов при вводе?
берем строку, создаем из нее массив путем разбиения по символу ',', делаем trim на все слова (убиваем лишние пробелы) и собираем массив в строку используя ',' - имеем строку с которой проще работать потому что нам известно, что лишних пробелов не будет...

насчет 2х и 3х таблиц - вы знаете что такое JOIN? если да, то я расскажу реализацию, если нет - покажу где почитать...
__________________
Баг, проявишийся при сдаче заказчику, является фичей...
Black Raven вне форума   Ответить с цитированием
Старый 12.11.2006, 18:06   #7
ПознавшийТьму
Senior Member
 
Регистрация: 22.05.2006
Адрес: Киев
Сообщений: 205
Отправить сообщение для ПознавшийТьму с помощью ICQ Отправить сообщение для ПознавшийТьму с помощью MSN

По умолчанию

Здраствуй.
Я понимаю, но я это делаю для человека далёкого от программирования. Просто эти слова потом отображаются в админской панели и она там может что угодно редактировать. И отображаются они так как хранятся в БД. А для восприятия лучше когда слова идут так: qwerty, qwerty2, qwerty3 (тоесть с пробелами)
А всё что ты написал я делаю когда юзер вводит слова для поиска. Создаю массив из этих слов и по очереди вставляю их вот в то регулярное выражение. Потом сортирую по релевантности и вывожу на экран.
Я просто довольно неожиданно получил заказ где надо юзать БД и у меня много времени не было. Я открыл свою книгу по php и нашёл там обзорную главу про MySQL. Так что знания мои не глубоки и мне было бы интерестно почитать дополнительную литературу. Конечно в этом случае это уже ничего не изменит, но в будущем пригодится.
__________________
Nightfall seems to come my way
and it seems as if to stay
ПознавшийТьму вне форума   Ответить с цитированием
Старый 27.11.2006, 15:48   #8
Black Raven
Senior Member
 
Регистрация: 21.10.2005
Адрес: Moscow
Сообщений: 362

По умолчанию

данные у пользователя надо отбирать и приводить в удобный для хранения вид.
выводить их можно как угодно...

http://mysql.ru - там доки есть...
__________________
Баг, проявишийся при сдаче заказчику, является фичей...
Black Raven вне форума   Ответить с цитированием
Старый 26.10.2009, 03:23   #9
crazy_bary
Пользователь
 
Аватар для crazy_bary
 
Регистрация: 18.10.2009
Сообщений: 1
Репутация: 0

По умолчанию регулярные выражения в MySQL

А вы тоже заметили, что благодаря коряво переведенной рекламе зарубежных товаров и коряво переведенным зарубежным фильмам мы теперь говорим на корявом русском языке?..
crazy_bary вне форума   Ответить с цитированием
Старый 12.12.2009, 04:21   #10
dalloceabah
Пользователь
 
Аватар для dalloceabah
 
Регистрация: 09.12.2009
Адрес: Россия
Сообщений: 18
Репутация: 0
Отправить сообщение для dalloceabah с помощью ICQ

По умолчанию регулярные выражения в MySQL

.
Для всех таблиц пишет, что владелец mysql:mysql. Мне требуется переделать, чтобы пользователь так и остался mysq, а группа стала user_name. Как это можно сделать, чтобы при этом все продолжало нормально работать без потери данных в БД?
__________________
Я теперь самая счастливая !!! Мне мой муж подарил
вот такой вот корсетик
dalloceabah вне форума   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Текущее время: 12:36. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot

Rambler's Top100