X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость ( Вход | Регистрация )

Открыть тему
Тема закрыта
> Помощь по MySQL
funkydance
funkydance
Topic Starter сообщение 5.4.2015, 5:51; Ответить: funkydance
Сообщение #1


Старожил
******


Группа: Banned
Сообщений: 1143
Регистрация: 9.10.2011
Поблагодарили: 282 раза
Репутация:   40  


Здравствуйте.
Делаю на сайте линковку и к каждому материалу прописываю по несколько ключей через запятую. Например: Яблоко, груша, мандарин.

У второго материала такие ключи: Дыня, Арбуз, Яблоко

Если у первого материала После первого ключа есть запятая, то он не находит материалы с таким же ключом.

Материал 1 = ключ ЯБЛОКО ища по второму материалу такой же ключ дыня, арбуз, Яблоко = УСПЕХ

А если у первого материала есть несколько ключей Яблоко, груша, мандарин то он не находит второй материал по ключу, потому что у него есть запятая, а у второго материала нету. И к тому же, функция LIKE останавливается на Яблоке и не переходит к груше и мандарину.

Что делаю не так? Код снизу. Уже всё перепробовал, даже наугад туда сюда всё менял, один фиг не пашет.
Получается, что LIKE берёт первый ключ (с запятой или без) и идёт искать по таблице похожие материалы. Если без запятой, тогда всё нормально. А если с запятой, тогда проблема. Яблоко, = Яблоко = Провал и + не учитывает, что после запятой могут быть ещё ключи, он выделяет первый ключ до запятой и начинает искать похожие ключи.


Сообщение отредактировал x64 - 5.4.2015, 18:32
Причина редактирования: -code, по просьбе ТС
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
kronos
kronos
сообщение 5.4.2015, 10:38; Ответить: kronos
Сообщение #2


Белый веб-мастер
*******


Группа: Active User
Сообщений: 4703
Регистрация: 10.2.2009
Из: Харьков
Поблагодарили: 2629 раз
Репутация:   327  


Неправильно организована БД. Между метками и материалами должна быть связь многие ко многому с отдельной таблицей ID_МАТЕРИАЛА - ID_МЕТКИ.
И что вообще содержит $_SESSION[lin] в разных случаях? Судя по вашим словам, это и есть метки через запятую? Тогда естевственно они в запросе не найдут ничего, это будет как искать "яблоко,банан,абрикос" в других "банан,мандарин,яблоко" Если стукните в аську, разберусь.

Сообщение отредактировал kronos - 5.4.2015, 10:39


--------------------


Поблагодарили: (1)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
x64
x64
сообщение 5.4.2015, 11:02; Ответить: x64
Сообщение #3


F.A.L.L.O.U.T.
*******

Группа: Super Moderator
Сообщений: 3544
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2881 раз
Репутация:   294  


Ни фига не понял, чего Вы хотите сделать.
LIKE — не регулярное выражение. Он ищет точное вхождение в строке (без учёта регистра, если не binary).
Пусть имеется строка 'Яблоко, груша, мандарин'. Тогда:
LIKE '%яблоко%', LIKE '%мандарин%' или LIKE '%груша%'
найдётся. Но не найдётся (более того, не должно!)
LIKE '%яблоко мандарин%', LIKE '%груша яблоко%' и т. п.
Либо делайте двойной лайк на поле:
metka LIKE '%яблоко%' AND metka LIKE '%груша%' -- либо OR, если достаточно что-то одно
либо посмотрите в сторону полнотекстового поиска MATCH AGAINST (там есть неприятные ограничения на минимальную длину слова),
либо регулярки,
либо sphinx копайте.
Можете что-то своё придумать, например, хранить слова в отдельной таблице, с помощью другой привязывать их к записям.

PS: и причём здесь Помощь по PHP? Это MySQL.


--------------------


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
funkydance
funkydance
Topic Starter сообщение 5.4.2015, 17:03; Ответить: funkydance
Сообщение #4


Старожил
******


Группа: Banned
Сообщений: 1143
Регистрация: 9.10.2011
Поблагодарили: 282 раза
Репутация:   40  


Цитата(kronos @ 5.4.2015, 11:38) *
И что вообще содержит $_SESSION[lin] в разных случаях? Судя по вашим словам, это и есть метки через запятую?


Да, это метки через запятую.

x64, Двойной LIKE тоже не помогает. Если у материала несколько тегов и они перечисляются через запятую, то LIKE берёт слово с запятой.
Если у материала один тег без запятых, тогда всё нормально. Уф, уже голова кипит. Про регулярки прочитал, толком ничего не понял, ща не в состояние всё понять сразу, только учусь.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
x64
x64
сообщение 5.4.2015, 18:48; Ответить: x64
Сообщение #5


F.A.L.L.O.U.T.
*******

Группа: Super Moderator
Сообщений: 3544
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2881 раз
Репутация:   294  


funkydance, для чего именно не помогает? Вам нужно одновременное срабатывание двух LIKE (условие по AND), либо по условию «один из» (условие по OR)?
В любом случае, ВЫ должны предварительно разбить запрашиваемые сравнения и каждому из них добавить в LIKE '%ключ%'.
Не забывайте про необходимость экранирования значений, приходящих от пользователя, с помощью вызова функции mysql_real_escape_string().

Цитата(funkydance @ 5.4.2015, 16:03) *
Если у материала несколько тегов и они перечисляются через запятую, то LIKE берёт слово с запятой.

1. Что конкретно нужно? Если пользователь ищет одновременно по виноград/мандарин/яблоко, должны выводить только поля, содержащие через запятую эти слова в строгом соответствии, или как? Если первое, самостоятельно позаботтесь об упорядочивании в определённом порядке.
2. Программист должен позаботиться о подготовке конкретных значений. Если пользователь запрашивает мандарин и яблоко, вы должны самостоятельно сформировать:
Код
`field` LIKE '%яблоко%' OR `field` LIKE '%мандарин%'

для выбора полей, где есть либо одно, либо другое (или оба сразу).

Цитата(funkydance @ 5.4.2015, 16:03) *
Да, это метки через запятую.

Код
$labels = explode(',', $_SESSION[lin]); # получим метки в массив
# пробежаться по меткам...
foreach ($labels as $k => $v) {
    # ...и подготовить каждую к запросу
    $labels[$k] = "`field` LIKE '%' . mysql_real_escape_string(trim($v)) . '%'";
}
# составить запрос вида «одно совпадение из нескольких»
$query = 'SELECT * FROM `table` WHERE ' . implode(' OR ', $labels);


--------------------


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
kronos
kronos
сообщение 5.4.2015, 18:51; Ответить: kronos
Сообщение #6


Белый веб-мастер
*******


Группа: Active User
Сообщений: 4703
Регистрация: 10.2.2009
Из: Харьков
Поблагодарили: 2629 раз
Репутация:   327  


добавлю к x64, на PHP это делается через функцию explode и дальнейший цикл foreach, где на каждое значение будет добавляться к запросу
Цитата
`field` LIKE '%яблоко%'

с OR разделением
----
опоздал

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.


Сообщение отредактировал kronos - 5.4.2015, 18:51


--------------------


Поблагодарили: (2)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Нужна помощь в поиске плагина для WP
Для создания каталога
3 Frankie 849 25.4.2018, 21:20
автор: Frankie
Открытая тема (нет новых ответов) Скорая помощь для ваших сайтов - Wordpress, DLE, Joomla, Drupal
Любые виды работ, профессионально, оперативно, не дорого.
15 wturm 3762 20.4.2018, 14:34
автор: Black_Mag
Открытая тема (нет новых ответов) Первая Компьютерная Помощь – Платим за лиды по ремонту (1000р/лид)
0 MrCrutch 456 19.4.2018, 12:27
автор: MrCrutch
Открытая тема (нет новых ответов) Сайт "Компьютерная помощь и ремонт компьютеров на дому в Новосибирске"
1 maxmer 669 2.4.2018, 10:06
автор: maxmer
Открытая тема (нет новых ответов) Требуется помощь по сайту-визитке.
3 Yas18 685 31.3.2018, 20:35
автор: Yas18


 



RSS Текстовая версия Сейчас: 25.5.2018, 2:08
Дизайн