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
Сообщений: 3435
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2750 раз
Репутация:   289  


Ни фига не понял, чего Вы хотите сделать.
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
Сообщений: 3435
Регистрация: 30.6.2011
Из: Железнодорожный (Балашиха)
Поблагодарили: 2750 раз
Репутация:   289  


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 разделением
----
опоздал

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


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


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


Свернуть

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

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Безвозмездная помощь в социальных сетях
Инвайты, посты, репосты, лайки и тп
9 PostBrigada 2300 16.12.2017, 15:47
автор: WildWeb8
Открытая тема (нет новых ответов) Нужна помощь в активации аккаунта AdSense
10 dimaguru 2609 15.12.2017, 11:12
автор: Ley
Открытая тема (нет новых ответов) Недорогие услуги - php/js/mysql/jquery/bootstrap
2 vlads 662 13.12.2017, 21:01
автор: vlads
Открытая тема (нет новых ответов) Нужна помощь с задачами по SEO
Звучит так себе конечно, однако очень нужна ваша помощь!!!
10 another_way 1542 25.11.2017, 13:35
автор: Bel_Ami
Открытая тема (нет новых ответов) envato market помощь в покупке
1 wagan 603 12.11.2017, 22:23
автор: EvilGomel


 



RSS Текстовая версия Сейчас: 18.12.2017, 15:13
Дизайн