Облако тэгов через поиск (PHP+mySQL)

SEOCondition
На сайте с 03.10.2011
Offline
118
1829

Доброго времени суток, форумчане!

Задался вопросом по организации облака тэгов, да не с отдельной таблицей, как это водится, а на основе поиска.

К сожалению, пока не могу полностью реализовать, возможно, кто-то подскажет.

Суть:

Имеем $_GET['tag'], url вида site.com/tag/red_apple/

При добавлении материала тэги прописываются через запятую

Соответственно, если имеем тэг red_apple, то достаточно прописать site.com/tag/apple/, и будет выведено совпадение, но поиск должен быть точным! По полной фразе т.е (в данном случае выведет все, что связано с apple, а это не ок)

К сожалению, через запрос это нельзя сделать по типу where tag = 'red_apple' т.к. у нас в строке прописано: red_apple, green_apple, yellow_apple и т.д

Получится where tag = 'red_apple, green_apple, yellow_apple'

Соответственно нужно как-то выбирать на уровне PHP каждый тэг, но тогда возникает вопрос с построением самого запроса

P.S: обычное облако тэгов могу организовать, необходимо именно на основе с точным вхождением в $_GET

[⚡] PBN под ключ, обслуживание, консультации — обращайтесь в личку
Aisamiery
На сайте с 12.04.2015
Offline
293
#1

Используйте оператор like

where tag like '%apple'

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
ДП
На сайте с 23.11.2009
Offline
203
#2

Поскольку теги разделены запятыми - то и ищи tag like '%,red_apple%' OR tag like 'red_apple%'

Второе условие, чтобы выбрать записи, у которых этот тег первый идёт.

Ну или еще вариант - выбирай обычным лайком и фильтруй уже средствами php. Если не нужно общее количество записей выводить - то пойдёт.

TF-Studio
На сайте с 17.08.2010
Offline
334
#3

лучше все же вынести теги в отдельные таблицы

1. таблица самих тегов (можно со статой, тайтлами и прочим)

2. таблица связей

лайк - не лучшая идея, хотя простая и быстрая реализация

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
SEOCondition
На сайте с 03.10.2011
Offline
118
#4
Aisamiery:
Используйте оператор like
where tag like '%apple'

в данном случае не сработает, будут выведены результаты не по точному вхождению + момент с перечислением тэгов не будет учтен

---------- Добавлено 05.11.2017 в 14:49 ----------

Дикий пионер:
Поскольку теги разделены запятыми - то и ищи tag like '%,red_apple%' OR tag like 'red_apple%'
Второе условие, чтобы выбрать записи, у которых этот тег первый идёт.
Ну или еще вариант - выбирай обычным лайком и фильтруй уже средствами php. Если не нужно общее количество записей выводить - то пойдёт.

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

---------- Добавлено 05.11.2017 в 14:52 ----------

TF-Studio:
лучше все же вынести теги в отдельные таблицы
1. таблица самих тегов (можно со статой, тайтлами и прочим)
2. таблица связей

лайк - не лучшая идея, хотя простая и быстрая реализация

для этого компонента тэги на основе поиска — оптимальный вариант, их будет до 1К (уник. значений) + весь вывод полностью кэшируется, да и количество результатов на страницу будет всего 12.

lutskboy
На сайте с 22.11.2013
Offline
171
#5

WHERE tag REGEXP'[[:<:]](mytag)[[:>:]]'

S
На сайте с 30.09.2016
Offline
469
#6
lutskboy:
[:<:]](mytag)[[:>:]

Красиво нарисовали...🤪

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
SeVlad
На сайте с 03.11.2008
Offline
1609
#7

Какой только дичи не придумают некоторые для оправдания своей лени/неграмотности.

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
SEOCondition
На сайте с 03.10.2011
Offline
118
#8

Доброй ночи! Составил запрос в режиме быдло-кода, отображает, вроде бы, так. Но есть одно "но", почему-то выводится один повторный результат, иногда больше. Пока не понял в чем дело.

Вот запрос

$res =  "SELECT a.id, a.title, a.category, a.date, b.folder FROM ".PREFIX."_{$table_1} as a, ".PREFIX."_table_2 as b WHERE `tags` LIKE ('%, ".$tag.", %') OR `tags` LIKE ('%, ".$tag."') OR `tags` LIKE ('".$tag.", %') AND a.category=b.id ORDER BY a.date DESC LIMIT 0,10";

Из table_2 нужно взять только данные из одного поля, folder, поскольку там хранится одна фичи, которая входит в формирование URL-а.

Пробовал тоже самое без объединения таблиц — все ок, левых ответов не выводит (имею ввиду вывод на сайте).

Возможно, кто-то знает в чем соль?

webiumpro
На сайте с 20.03.2017
Offline
39
#9
SEOCondition:
почему-то выводится один повторный результат, иногда больше

Вероятно, таблицы неправильно связываете. Либо у вас связь один ко многим, тогда используйте group by по тем записям, которые не должны повторяться

Копирование лендингов. Разработка на фреймворке сервисов. Создание сайтов (/ru/forum/994418)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий