[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Реализация системы тегов
h@@
Есть задача реализовать систему тегов. Пользователь водит теги через запятую, записываю БД.

new_tbl
| id | title | text | teg |
| 1 | title1 | text1 | teg1,teg2,teg3 |
| 2 | title2 | text1 | teg9,teg5,teg4 |
| 3 | title3 | text1 | teg6,teg8,teg7 |

И нужно выводить все новости на тег. Делаю так

 SELECT *
FROM new_tbl
WHERE teg
LIKE \'%'.$teg.'%\'
ORDER by teg
LIMIT 50'


Как правильно сортировать? Что бы $teg оставался на первом месте. Так как LIKE находит похожие теги.

chee
h@@, ты бы сначала нормализовал таблицу с данными, возможно сразу бы вопросы отпали.


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
stump
Хранить данные в таблице через запятую не гуд. Надо нормализовать БД и получить другую структуру. Думаю после нормализации, при новой структуре БД, вопрос отпадет сам собой.

_____________
Трус не играет в хокей
h@@
Я думал для тегов сделать оттдельную таблицу, но не знаю как записать туда теги, если пользователь ведет их через запятую.
volter9
h@@
Создаешь отдельную таблицу для тэгов:
Таблица tags
id | title
1 | my_tag
2 | another tag
3 | more tags

Создаешь таблицу для связки тэгов и статьей (контента в общем):
Таблица articles_tags
article_id | tag_id
1 | 1
1 | 2
2 | 3

Ну и сами статьи (контент):
Таблица articles
id | title | text
1 | title1 | text1
2 | title2 | text1
3 | title3 | text1

Что бы получить статьи для определенного тэга, пишешь приблизительно такой SQL:
SELECT a.id, a.title, a.text
FROM articles a
LEFT JOIN articles_tags a_t ON (a_t.article_id = a.id)
WHERE a_t.tag_id = $tag_id

Где $tag_id = id тэга для которого нужно найти статьи

Что бы получить тэги для определенной статьи, пишешь приблизительно такой SQL:
SELECT t.id, t.title
FROM tags t
LEFT JOIN articles_tags a_t ON (a_t.tag_id = t.id)
WHERE a_t.article_id = $article_id

Где $article_id = id статьи для которого нужно найти тэги

P.S.: Код не проверял, но по идеи должно работать

_____________
Мой блог
AllesKlar
Цитата (h@@ @ 15.03.2015 - 17:19)
Я думал для тегов сделать оттдельную таблицу, но не знаю как записать туда теги, если пользователь ведет их через запятую.

$tags_array = explode(',', $tags_str);
var_dump($tags_array);
// в запросах используешь не $tags_array[$i], a trim($tags_array[$i])


_____________
[продано копирайтерам]
h@@
А как быть с таблицей для связки тэгов и статьей? Как я узнаю id статьи и id тега?
volter9
h@@
Ну да к у Вас должна быть страница где выводятся статьи:
<?php foreach ($articles as $article): ?> 
<a href="article/<?php echo $article['id'] ?>">
<?php echo $article['title'] ?>
</a>

<?php echo $article['text'] ?>
<?php
endforeach; ?>

Ссылка ведет на шаблон с выводом одной статьи и ее тэгов.

Ну и на странице со статьей выводится статья + ее тэги:
<?php /* Тут запрашиваете статью и ее тэги (тэги через id статьи) */ ?> 

<!-- Тут вывод самой статьи -->

<
ul>
<?php foreach ($tags as $tag): ?>
<li>
<
a href="/articles/by_tag/<?php echo $tag['id'] ?>/">
<?php echo $tag['title'] ?>
</a>
</
li>
<?php endforeach; ?>
</ul>

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

_____________
Мой блог
h@@
Да, я это понимаю. А как записать в таблицу articles_tags, articl_id и tag_id?
AllesKlar
1. заносишь статью в таблицу articles, получаешь articles_id
2. Получаешь строку с тегами.
3. загоняешь теги из строки в массив.
4. цикл по массиву тегов:
4а. если тег в таблице tags не существует, заносишь его, читаешь его tag_id. если существует, читаешь его tag_id
4b. в таблицу articles_tags заносишь пару articles_id, tag_id




_____________
[продано копирайтерам]
h@@
Всем огромное спасибо. Все работает :)
Сделал такой код для добавления в таблицу articles_tags.

Нашел максимальный id articles
SELECT MAX(id) FROM articles


Нашел id тега
SELECT id, tags FROM tags WHERE tag= $teg[$i]'


Записал articles_tags
INSERT INTO articles_tags SET articles_id=$max_id, tag_id=$teg_id['id']'


Все правильно или можно было сделать по-другому?
stump
Цитата (h@@ @ 16.03.2015 - 12:10)
Записал articles_tags
<pre class="sh_sourceCode" rel="sql"><span class="sh_keyword">INSERT INTO</span> articles_tags <span class="sh_type">SET</span> articles_id<span class="sh_symbol">=</span>$max_id<span class="sh_symbol">,</span> tag_id<span class="sh_symbol">=</span>$teg_id<span class="sh_symbol">[</span><span class="sh_string">'id'</span><span class="sh_symbol">]</span><span class="sh_string">'</span></pre>

Все правильно или можно было сделать по-другому?

Нужно по другому! Во-первых не путать INSERT с UPDATE.

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

$articles = $articles->current();
$tag = tags[$i];

INSERT INTO articles_tags VALUE ( $articles, ( SELECT id FROM tags WHERE tag = $tag ) );


_____________
Трус не играет в хокей
h@@
Я что-то тут не понял. А почему нельзя то? Вроде все работает.
Игорь_Vasinsky
Правильный ответ тут http://phpforum.su/index.php?act=Print&cli...limin=4&limit=1

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
stump
Цитата (h@@ @ 16.03.2015 - 13:41)
Я что-то тут не понял. А почему нельзя то? Вроде все работает.

Почему можно:
Если работает то можно. Только инструкция INSERT ... SET работает только в MySQL и не является синтаксисом SQL, а есть спец. расширением.

В типичном SQL инструкция имеет вид:
INSERT INTO table_name (field1, field2, [field3, ...]) VALUES (value_for_field1, value_for_field2, [value_for_field3, ...]), [(value_for_field1, value_for_field2, [value_for_field3, ...]), ...];


Каких либо аргументов в пользу той или иной конструкции нет.

Почему нельзя:
$teg[$i]

tag_id=$teg_id['id']

говорит что обработка идет в цикле. выполнять запрос в цикле - дурной тон работы с БД. Надо конструировать БД и запросы так, чтобы СУБД все циклы обрабатывало самостоятельно.

Цитата (Игорь_Vasinsky @ 16.03.2015 - 14:06)
Правильный ответ тут http://phpforum.su/index.php?act=Print&cli...limin=4&limit=1


volter9 про слект просвятил, еще надо просвятить про инсерт.

_____________
Трус не играет в хокей
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.