Создание облака тегов с MySQL и PHP - PullRequest
3 голосов
/ 16 февраля 2011

Я создаю облако тегов.У меня есть таблица, называемая тегами со строкой «id» и строкой «tag».

Каждая строка 'tag' будет такой же, как на этом сайте - представьте себе тег 'foo' для этого примера.

Каждая строка 'id' будет идентификатором веб-страницкоторые помечены чем-то - 'foo', в этом примере.

Таким образом, любая произвольная строка может выглядеть так:$ tag, и, если он существует, добавьте пробел и $ id в строку 'id' для этого тега.Если тег не существует в моей таблице, добавьте тег и добавьте идентификатор.

Код, который у меня есть (наполовину PHP, наполовину псевдо), выглядит следующим образом:

if($tag doesnt exist in table)
{
     mysql_query("INSERT INTO tags (tag, id) VALUES ('$tag', '$id'");
}
if($tag exists in table)
{
     mysql_query("...append somehow... $id . " " WHERE tag = '$tag'");
}

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

Ответы [ 4 ]

1 голос
/ 16 февраля 2011

Существует лучший способ для достижения этой функциональности.Обычно для реализации системы тегов у вас есть две таблицы, теги и item_tags (или другое имя, которое имеет смысл в вашей системе). Таблица тегов будет содержать идентификатор тега и имя тега, а таблица item_tags будет содержать идентификатор тега.и item_it (какой бы элемент вы не пометили в качестве идентификатора).Там будет 1 строка на тег для каждого элемента.Поэтому, если у элемента есть 3 тега, в таблице item_tags будет 3 строки.Это упростит ваше приложение и, вероятно, уменьшит нагрузку на сервер базы данных.

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

hth

0 голосов
/ 16 февраля 2011

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

Таким образом, ваши результаты будут такими: 1, «первый тег», 1, «второй тег»", 1," еще один тег ".Если вы используете INSERT IGNORE, он будет игнорировать обманщиков.Таким образом, по одной строке для каждого тега для идентификатора сайта.

0 голосов
/ 16 февраля 2011

Вам нужно три таблицы для достижения этой цели (т.е. без дублирования данных или неправильного использования полей):

Содержимое (вещи, которые пишут люди, имеющие теги) Теги (список тегов) ContentTags (aсписок тегов применительно к контенту)

Примером может быть статья «abc» с тегами «foo» и «bar».

Контент будет содержать строку с ContentID (1, например), и содержание (abc).Теги будут иметь две строки: каждая с TagID (1, 2 соответственно) и TagText (foo, bar) ContentTags также будет иметь две строки с ContentTagID (1, 2), ContentID (1, 1) и TagID (1, 2).

Таким образом, вы можете загружать различные теги (хранящиеся в таблице тегов) и связывать их со статьями (с записями в ContentTags).

Чтобы вставить новый тег, добавьте его в таблицу тегов, а затем добавьте в ContentTags запись, связывающую только что добавленный тег с только что добавленной статьей.

Чтобы проверить, является литег существует для новой статьи, выполните запрос к тегам (например, «ВЫБЕРИТЕ TagID ИЗ ТЕМ, ГДЕ TagText = $ tagText»).Если вы получаете результат, тег существует, и вам просто нужно добавить запись в ContentTags с только что извлеченным TagID и ArticleID только что добавленной статьи.

Надеюсь, этонекоторая помощь,

0 голосов
/ 16 февраля 2011

Почему бы просто не иметь несколько строк в таблице tags? Один на веб-страницу с тегом?

Получить страницы для данного тега:

SELECT id FROM tags WHERE tag = `my-tag`;

Добавление нового:

INSERT INTO tags (tag, id) VALUES ('my-tag', newWebpageID);

Удаление веб-страницы:

DELETE FROM tags WHERE id = webpageID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...