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



 

Здравствуйте, гость (

| Вход | Регистрация )

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


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

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

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

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

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

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


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


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

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


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


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


Ни фига не понял, чего Вы хотите сделать.
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


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


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

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


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


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

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

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


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


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


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


Свернуть

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

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Требуется помощь по сайту на "ВордПресс"
Закрылся доступ в панель администратора
15 Tia2 2364 17.4.2024, 0:54
автор: diviner99
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыСостояние после ампутации - нужна помощь
благотворительный топик
49 vitvirtual 5893 1.4.2024, 5:23
автор: vitvirtual
Открытая тема (нет новых ответов) требуется помощь с themasoftware (Темапостером)
0 Taylor 627 16.3.2024, 18:41
автор: Taylor
Открытая тема (нет новых ответов) Услуги по созданию и доработке скриптов PHP, MySQL, JavaScript, jQuery
Разработка сайтов и сервисов под-ключ
0 alexey 1243 24.11.2023, 14:46
автор: alexey
Открытая тема (нет новых ответов) Нужна помощь
download traffic
7 Adblock_Affilate 1440 4.5.2023, 22:01
автор: kuprum


 



RSS Текстовая версия Сейчас: 23.4.2024, 16:21
Дизайн